blob: 3ede1e4878548b88a61500e65bbaed5f5230e000 [file] [log] [blame]
grammar gn;
/*
* Lexer Rules
*/
r : statementlist EOF;
//string : '"' ( NLETTER | DIGIT | LETTER | Escape | expansion)* '"' ;
//Escape : '\\' ( '$' | '"' | NLETTER | DIGIT | LETTER) ;
//bracketexpansion : '{' ( Identifier | arrayaccess | scopeaccess ) '}' ;
//expansion : '$' ( Identifier | bracketexpansion | HEX ) ;
statement : assignment | call | condition ;
lvalue : Identifier | arrayaccess | scopeaccess ;
assignment : lvalue AssignOp expr ;
call : Identifier '(' exprlist? ')' block? ;
condition : 'if' '(' expr ')' block
(elsec ( condition | block ))? ;
block : '{' statementlist '}' ;
statementlist : ( statement | comment )* ;
arrayaccess : Identifier '[' expr ']' ;
scopeaccess : Identifier '.' Identifier ;
expr : unaryexpr | expr BinaryOp expr ;
unaryexpr : primaryexpr | UnaryOp unaryexpr ;
primaryexpr : Identifier | Integer | String | call
| arrayaccess | scopeaccess | block
| '(' expr ')'
| '[' ( exprlist ','? )? ']' ;
exprlist : expr ( ',' expr )* ;
elsec : 'else' ;
comment : COMMENT ;
AssignOp : '=' | '+=' | '-=' ;
UnaryOp : '!' ;
BinaryOp : '+' | '-'
| '<' | '<=' | '>' | '>='
| '==' | '!='
| '&&'
| '||' ;
Identifier : LETTER ( DIGIT | LETTER )* ;
Integer : '-'? DIGIT+ ;
String : '"' ('\\"'|~'"')* '"' ;
fragment DIGIT : [0-9] ;
fragment LETTER : ([a-z] | [A-Z] | '_') ;
COMMENT : '#' ~[\r\n]* '\r'? '\n' -> skip ;
WS : [ \r\n] -> skip ;
//NLETTER : ~[\r\n$"0-9a-zA-Z_] ;
//HEX : '0x' [0-9A-Fa-f]+ ;