]> gitweb.ps.run Git - toc/blobdiff - 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
diff --git a/antlr4-cpp-runtime-4.9.2-source/demo/TParser.g4 b/antlr4-cpp-runtime-4.9.2-source/demo/TParser.g4
new file mode 100644 (file)
index 0000000..9f25be9
--- /dev/null
@@ -0,0 +1,119 @@
+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 = .;