10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-11-14 10:03:39 +01:00
QCaml/Nuclei/Xyz_parser.mly

59 lines
1.5 KiB
OCaml
Raw Normal View History

2018-01-17 15:56:57 +01:00
/* Parses nuclear coordinates in xyz format */
2017-12-31 18:27:58 +01:00
%{
exception InputError of string
%}
%token EOL
%token <string> SPACE
%token <string> WORD
%token <int> INTEGER
%token <float> FLOAT
%token EOF
2018-01-17 15:56:57 +01:00
%start input
2018-01-18 00:21:05 +01:00
%type <(Element.t * Coordinate.t) array> input
2017-12-31 18:27:58 +01:00
%% /* Grammar rules and actions follow */
2018-01-17 15:56:57 +01:00
input:
2018-01-02 22:33:17 +01:00
| integer title atoms_xyz {
2017-12-31 18:27:58 +01:00
let len = List.length $3 in
if len <> $1 then
let error_msg = Printf.sprintf "%d atoms entered, expected %d" len $1 in
raise (InputError error_msg)
else
2018-01-17 15:56:57 +01:00
Array.of_list $3
2017-12-31 18:27:58 +01:00
}
integer:
| INTEGER EOL { $1 }
| INTEGER SPACE EOL { $1 }
title:
| title_list EOL { $1 }
text:
| WORD {$1 }
| SPACE {$1 }
| FLOAT {(string_of_float $1)}
| INTEGER {(string_of_int $1)}
title_list:
| { "" }
| title_list text { $1 ^ $2 }
2018-01-02 22:33:17 +01:00
atoms_xyz:
2017-12-31 18:27:58 +01:00
| atoms_list EOL { List.rev $1 }
| atoms_list EOF { List.rev $1 }
atoms_list:
| { [] }
2018-01-18 14:56:08 +01:00
| atoms_list WORD SPACE FLOAT SPACE FLOAT SPACE FLOAT EOL { (Element.of_string $2, Coordinate.of_3_floats $4 $6 $8 `Angstrom ) :: $1 }
| atoms_list WORD SPACE FLOAT SPACE FLOAT SPACE FLOAT SPACE EOL { (Element.of_string $2, Coordinate.of_3_floats $4 $6 $8 `Angstrom ) :: $1 }
| atoms_list INTEGER SPACE FLOAT SPACE FLOAT SPACE FLOAT EOL { (Element.of_int $2, Coordinate.of_3_floats $4 $6 $8 `Angstrom ) :: $1 }
| atoms_list INTEGER SPACE FLOAT SPACE FLOAT SPACE FLOAT SPACE EOL { (Element.of_int $2, Coordinate.of_3_floats $4 $6 $8 `Angstrom ) :: $1 }
2018-01-02 22:33:17 +01:00
2017-12-31 18:27:58 +01:00