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 | expr QuestionMark expr Colon expr | 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 = .;