| parser grammar TParser; |
| |
| options { |
| tokenVocab = TLexer; |
| } |
| |
| // These are all supported parser sections: |
| |
| // Parser file header. Appears at the top in all parser related files. Use e.g. for copyrights. |
| @parser::header {/* parser/listener/visitor header section */} |
| |
| // Appears before any #include in h + cpp files. |
| @parser::preinclude {/* parser precinclude section */} |
| |
| // Follows directly after the standard #includes in h + cpp files. |
| @parser::postinclude { |
| /* parser postinclude section */ |
| #ifndef _WIN32 |
| #pragma GCC diagnostic ignored "-Wunused-parameter" |
| #endif |
| } |
| |
| // Directly preceeds the parser class declaration in the h file (e.g. for additional types etc.). |
| @parser::context {/* parser context section */} |
| |
| // Appears in the private part of the parser in the h file. |
| // The function bodies could also appear in the definitions section, but I want to maximize |
| // Java compatibility, so we can also create a Java parser from this grammar. |
| // Still, some tweaking is necessary after the Java file generation (e.g. bool -> boolean). |
| @parser::members { |
| /* public parser declarations/members section */ |
| bool myAction() { return true; } |
| bool doesItBlend() { return true; } |
| void cleanUp() {} |
| void doInit() {} |
| void doAfter() {} |
| } |
| |
| // Appears in the public part of the parser in the h file. |
| @parser::declarations {/* private parser declarations section */} |
| |
| // Appears in line with the other class member definitions in the cpp file. |
| @parser::definitions {/* parser definitions section */} |
| |
| // Additionally there are similar sections for (base)listener and (base)visitor files. |
| @parser::listenerpreinclude {/* listener preinclude section */} |
| @parser::listenerpostinclude {/* listener postinclude section */} |
| @parser::listenerdeclarations {/* listener public declarations/members section */} |
| @parser::listenermembers {/* listener private declarations/members section */} |
| @parser::listenerdefinitions {/* listener definitions section */} |
| |
| @parser::baselistenerpreinclude {/* base listener preinclude section */} |
| @parser::baselistenerpostinclude {/* base listener postinclude section */} |
| @parser::baselistenerdeclarations {/* base listener public declarations/members section */} |
| @parser::baselistenermembers {/* base listener private declarations/members section */} |
| @parser::baselistenerdefinitions {/* base listener definitions section */} |
| |
| @parser::visitorpreinclude {/* visitor preinclude section */} |
| @parser::visitorpostinclude {/* visitor postinclude section */} |
| @parser::visitordeclarations {/* visitor public declarations/members section */} |
| @parser::visitormembers {/* visitor private declarations/members section */} |
| @parser::visitordefinitions {/* visitor definitions section */} |
| |
| @parser::basevisitorpreinclude {/* base visitor preinclude section */} |
| @parser::basevisitorpostinclude {/* base visitor postinclude section */} |
| @parser::basevisitordeclarations {/* base visitor public declarations/members section */} |
| @parser::basevisitormembers {/* base visitor private declarations/members section */} |
| @parser::basevisitordefinitions {/* base visitor definitions section */} |
| |
| // Actual grammar start. |
| main: stat+ EOF; |
| divide : ID (and_ GreaterThan)? {doesItBlend()}?; |
| and_ @init{ doInit(); } @after { doAfter(); } : And ; |
| |
| conquer: |
| divide+ |
| | {doesItBlend()}? and_ { myAction(); } |
| | ID (LessThan* divide)?? { $ID.text; } |
| ; |
| |
| // Unused rule to demonstrate some of the special features. |
| unused[double input = 111] returns [double calculated] locals [int _a, double _b, int _c] @init{ doInit(); } @after { doAfter(); } : |
| stat |
| ; |
| catch [...] { |
| // Replaces the standard exception handling. |
| } |
| finally { |
| cleanUp(); |
| } |
| |
| unused2: |
| (unused[1] .)+ (Colon | Semicolon | Plus)? ~Semicolon |
| ; |
| |
| stat: expr Equal expr Semicolon |
| | expr Semicolon |
| ; |
| |
| expr: expr Star expr |
| | expr Plus expr |
| | OpenPar expr ClosePar |
| | <assoc = right> expr QuestionMark expr Colon expr |
| | <assoc = right> expr Equal expr |
| | identifier = id |
| | flowControl |
| | INT |
| | String |
| ; |
| |
| flowControl: |
| Return expr # Return |
| | Continue # Continue |
| ; |
| |
| id: ID; |
| array : OpenCurly el += INT (Comma el += INT)* CloseCurly; |
| idarray : OpenCurly element += id (Comma element += id)* CloseCurly; |
| any: t = .; |