Skip to content

Instantly share code, notes, and snippets.

@sjohnr
Created March 12, 2014 02:13
Show Gist options
  • Save sjohnr/9499366 to your computer and use it in GitHub Desktop.
Save sjohnr/9499366 to your computer and use it in GitHub Desktop.
Learning ANTLR
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 : ['] ;
# 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