]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/demo/TParser.g4
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / demo / TParser.g4
1 parser grammar TParser;
2
3 options {
4         tokenVocab = TLexer;
5 }
6
7 // These are all supported parser sections:
8
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 */}
11
12 // Appears before any #include in h + cpp files.
13 @parser::preinclude {/* parser precinclude section */}
14
15 // Follows directly after the standard #includes in h + cpp files.
16 @parser::postinclude {
17 /* parser postinclude section */
18 #ifndef _WIN32
19 #pragma GCC diagnostic ignored "-Wunused-parameter"
20 #endif
21 }
22
23 // Directly preceeds the parser class declaration in the h file (e.g. for additional types etc.).
24 @parser::context {/* parser context section */}
25
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).
30 @parser::members {
31 /* public parser declarations/members section */
32 bool myAction() { return true; }
33 bool doesItBlend() { return true; }
34 void cleanUp() {}
35 void doInit() {}
36 void doAfter() {}
37 }
38
39 // Appears in the public part of the parser in the h file.
40 @parser::declarations {/* private parser declarations section */}
41
42 // Appears in line with the other class member definitions in the cpp file.
43 @parser::definitions {/* parser definitions section */}
44
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 */}
51
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 */}
57
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 */}
63
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 */}
69
70 // Actual grammar start.
71 main: stat+ EOF;
72 divide : ID (and_ GreaterThan)? {doesItBlend()}?;
73 and_ @init{ doInit(); } @after { doAfter(); } : And ;
74
75 conquer:
76         divide+
77         | {doesItBlend()}? and_ { myAction(); }
78         | ID (LessThan* divide)?? { $ID.text; }
79 ;
80
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(); } :
83         stat
84 ;
85 catch [...] {
86   // Replaces the standard exception handling.
87 }
88 finally {
89   cleanUp();
90 }
91
92 unused2:
93         (unused[1] .)+ (Colon | Semicolon | Plus)? ~Semicolon
94 ;
95
96 stat: expr Equal expr Semicolon
97     | expr Semicolon
98 ;
99
100 expr: expr Star expr
101     | expr Plus expr
102     | OpenPar expr ClosePar
103     | <assoc = right> expr QuestionMark expr Colon expr
104     | <assoc = right> expr Equal expr
105     | identifier = id
106     | flowControl
107     | INT
108     | String
109 ;
110
111 flowControl:
112         Return expr # Return
113         | Continue # Continue
114 ;
115
116 id: ID;
117 array : OpenCurly el += INT (Comma el += INT)* CloseCurly;
118 idarray : OpenCurly element += id (Comma element += id)* CloseCurly;
119 any: t = .;