1 parser grammar TParser;
7 // These are all supported parser sections:
9 // Parser file header. Appears at the top in all parser related files. Use e.g. for copyrights.
10 @parser::header {/* parser/listener/visitor header section */}
12 // Appears before any #include in h + cpp files.
13 @parser::preinclude {/* parser precinclude section */}
15 // Follows directly after the standard #includes in h + cpp files.
16 @parser::postinclude {
17 /* parser postinclude section */
19 #pragma GCC diagnostic ignored "-Wunused-parameter"
23 // Directly preceeds the parser class declaration in the h file (e.g. for additional types etc.).
24 @parser::context {/* parser context section */}
26 // Appears in the private part of the parser in the h file.
27 // The function bodies could also appear in the definitions section, but I want to maximize
28 // Java compatibility, so we can also create a Java parser from this grammar.
29 // Still, some tweaking is necessary after the Java file generation (e.g. bool -> boolean).
31 /* public parser declarations/members section */
32 bool myAction() { return true; }
33 bool doesItBlend() { return true; }
39 // Appears in the public part of the parser in the h file.
40 @parser::declarations {/* private parser declarations section */}
42 // Appears in line with the other class member definitions in the cpp file.
43 @parser::definitions {/* parser definitions section */}
45 // Additionally there are similar sections for (base)listener and (base)visitor files.
46 @parser::listenerpreinclude {/* listener preinclude section */}
47 @parser::listenerpostinclude {/* listener postinclude section */}
48 @parser::listenerdeclarations {/* listener public declarations/members section */}
49 @parser::listenermembers {/* listener private declarations/members section */}
50 @parser::listenerdefinitions {/* listener definitions section */}
52 @parser::baselistenerpreinclude {/* base listener preinclude section */}
53 @parser::baselistenerpostinclude {/* base listener postinclude section */}
54 @parser::baselistenerdeclarations {/* base listener public declarations/members section */}
55 @parser::baselistenermembers {/* base listener private declarations/members section */}
56 @parser::baselistenerdefinitions {/* base listener definitions section */}
58 @parser::visitorpreinclude {/* visitor preinclude section */}
59 @parser::visitorpostinclude {/* visitor postinclude section */}
60 @parser::visitordeclarations {/* visitor public declarations/members section */}
61 @parser::visitormembers {/* visitor private declarations/members section */}
62 @parser::visitordefinitions {/* visitor definitions section */}
64 @parser::basevisitorpreinclude {/* base visitor preinclude section */}
65 @parser::basevisitorpostinclude {/* base visitor postinclude section */}
66 @parser::basevisitordeclarations {/* base visitor public declarations/members section */}
67 @parser::basevisitormembers {/* base visitor private declarations/members section */}
68 @parser::basevisitordefinitions {/* base visitor definitions section */}
70 // Actual grammar start.
72 divide : ID (and_ GreaterThan)? {doesItBlend()}?;
73 and_ @init{ doInit(); } @after { doAfter(); } : And ;
77 | {doesItBlend()}? and_ { myAction(); }
78 | ID (LessThan* divide)?? { $ID.text; }
81 // Unused rule to demonstrate some of the special features.
82 unused[double input = 111] returns [double calculated] locals [int _a, double _b, int _c] @init{ doInit(); } @after { doAfter(); } :
86 // Replaces the standard exception handling.
93 (unused[1] .)+ (Colon | Semicolon | Plus)? ~Semicolon
96 stat: expr Equal expr Semicolon
102 | OpenPar expr ClosePar
103 | <assoc = right> expr QuestionMark expr Colon expr
104 | <assoc = right> expr Equal expr
113 | Continue # Continue
117 array : OpenCurly el += INT (Comma el += INT)* CloseCurly;
118 idarray : OpenCurly element += id (Comma element += id)* CloseCurly;