Created
March 12, 2014 02:13
-
-
Save sjohnr/9499366 to your computer and use it in GitHub Desktop.
Learning ANTLR
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
grammar Grunge; | |
root : statement*; | |
// language rules | |
literal : LITERAL | |
| '{' LITERAL ( ',' LITERAL )* '}' | |
; | |
variable : VAR ; | |
constant : CONSTANT ; | |
expression : literal | |
| variable | |
| constant | |
| expression '==' expression | |
| '(' expression ')' | |
; | |
assignment : VAR '=' expression ';' ; | |
conditional : IF '(' expression ')' | |
( '{' statement* '}' | statement ) | |
( ELSE ( '{' statement* '}' | statement ) )? | |
; | |
call : VAR '(' ( expression ( ',' expression )* )? ')' ';' ; | |
closure : VAR '{' statement* '}' ; | |
statement : assignment | |
| conditional | |
| call | |
| closure | |
; | |
// keywords | |
IF : 'if' ; | |
ELSE : 'else' ; | |
// tokens | |
CONSTANT : UPPER_ALPHA ( UPPER_ALPHA | DIGIT | UNDERSCORE )* ; | |
VAR : LOWER_ALPHA ( ALPHA | DIGIT | UNDERSCORE )* ; | |
ARRAY : '{' LITERAL ( ',' LITERAL )* '}' ; | |
LITERAL : STRING | INT | CHAR ; | |
// skip tokens | |
COMMENT : ( MULTILINE_COMMENT | SINGLELINE_COMMENT ) -> skip ; | |
MULTILINE_COMMENT : '/*' .*? '*/' ; | |
SINGLELINE_COMMENT : ( '#' | '//' ) ~[\r\n]* NEWLINE ; | |
WHITESPACE : ( ' ' | ' ' )+ -> skip ; | |
NEWLINE : [\r\n]+ -> skip ; | |
// building blocks | |
fragment STRING : QUOTE ( ESC_QUOTE | ~["] )* QUOTE ; | |
fragment CHAR : TICK ( ESC_TICK | SYMBOL | ALPHA | DIGIT ) TICK ; | |
fragment INT : DIGIT+ ; | |
fragment LOWER_ALPHA : [a-z] ; | |
fragment UPPER_ALPHA : [A-Z] ; | |
fragment ALPHA : [a-zA-Z] ; | |
fragment DIGIT : [0-9] ; | |
fragment SYMBOL : [`~!@#$%^&*()-_=+{}\[\]\\|;:'",.<>/?] ; | |
fragment UNDERSCORE : '_' ; | |
fragment QUOTE : '"' ; | |
fragment ESC_QUOTE : '\\\"' ; | |
fragment ESC_TICK : '\\\'' ; | |
fragment TICK : ['] ; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Test comment | |
myClosure { | |
myVar = "My Literal"; | |
myVar2= | |
"Another$_1234= \\ \" Literal"; | |
myVar_3 =123; | |
// My comment | |
myVar456_='$' // Intrusive comment | |
; | |
} | |
myClosure_2 { | |
myVar = "Assignment"; | |
if (myVar == "My Literal") { | |
myVar = "Another Literal" /** really stupidly inline | |
* comment | |
up in here | |
*/ | |
; | |
myFunc("Param1", /* inline comment */ var2, var1 == var2); | |
myVar = (var1 == var2); | |
myFunc("Param2", myVar, {1, 2, 3}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment