diff options
author | Chimrod <> | 2023-10-06 08:35:56 +0200 |
---|---|---|
committer | Chimrod <> | 2023-10-06 08:35:56 +0200 |
commit | 97ab5c9a21166f0bffee482210d69877fd6809fa (patch) | |
tree | d1fa44000fa07631edc8924a90020f2cfe637263 /lib/qparser/parser.mly | |
parent | 40f4dbe7844725e0ab07f03f25c35f55b4699b46 (diff) |
Moved qparser and syntax in the library folder
Diffstat (limited to 'lib/qparser/parser.mly')
-rw-r--r-- | lib/qparser/parser.mly | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/qparser/parser.mly b/lib/qparser/parser.mly new file mode 100644 index 0000000..84c1af8 --- /dev/null +++ b/lib/qparser/parser.mly @@ -0,0 +1,89 @@ + +%{ + module T = Qsp_syntax.T +%} + +%parameter<Analyzer: Qsp_syntax.S.Analyzer> +%start <Analyzer.Location.repr>main +%on_error_reduce expression instruction unary_operator assignation_operator + +%% + +main: + | before_location* + LOCATION_START + EOL+ + expressions = line_statement* + LOCATION_END + { + Analyzer.Location.location $loc expressions + } + +before_location: + | EOL {} + | COMMENT EOL { } + +(* All these statement should terminate with EOL *) +line_statement: + | COMMENT EOL+ { Analyzer.Instruction.comment $loc } + | COLUMN i=IDENT EOL* { Analyzer.Instruction.location $loc i } + | s = terminated(instruction, line_sep) + | s = terminated(inline_action, line_sep) + { s } + | a = action_bloc(IF, elif_else_body) + { let loc, expression, statements, loc_s, body = a in + let elifs, else_ = match body with + | None -> [], [] + | Some (elifs, else_) -> (elifs, else_) + in + Analyzer.Instruction.if_ + loc + (loc_s, expression, statements) + ~elifs + ~else_ + } + | a = action_bloc(ACT, empty_body) + { let loc, label, statements, _, _ = a in + Analyzer.Instruction.act loc ~label statements + } + +(** Represent an instruction which can either be on a single line, + or created in a block until an END + *) +%inline action_bloc(TOKEN, BODY): + | TOKEN + e = expression + COLUMN EOL+ + s = line_statement* + b = BODY + END TOKEN? + line_sep + { $loc, e, s, $loc(s), b } + +empty_body: + | { None } + +elif: + | ELIF + e = expression + COLUMN EOL+ + s = line_statement* + { $loc, e, s } + +else_: + | ELSE EOL+ + expressions = line_statement* + { expressions } + | { [] } + + +elif_else_body: + | elifs = elif* + else_ = else_ + { Some (elifs, else_) } + + +%inline line_sep: + | EOL+ + | AMPERSAND+ EOL* + {} |