1grammar gn; 2 3 4/* 5 * Lexer Rules 6 */ 7 8r : statementlist EOF; 9 10 11 12//string : '"' ( NLETTER | DIGIT | LETTER | Escape | expansion)* '"' ; 13 14//Escape : '\\' ( '$' | '"' | NLETTER | DIGIT | LETTER) ; 15 16//bracketexpansion : '{' ( Identifier | arrayaccess | scopeaccess ) '}' ; 17 18//expansion : '$' ( Identifier | bracketexpansion | HEX ) ; 19 20statement : assignment | call | condition ; 21lvalue : Identifier | arrayaccess | scopeaccess ; 22assignment : lvalue AssignOp expr ; 23call : Identifier '(' exprlist? ')' block? ; 24condition : 'if' '(' expr ')' block 25 (elsec ( condition | block ))? ; 26block : '{' statementlist '}' ; 27statementlist : ( statement | comment )* ; 28arrayaccess : Identifier '[' expr ']' ; 29scopeaccess : Identifier '.' Identifier ; 30expr : unaryexpr | expr BinaryOp expr ; 31unaryexpr : primaryexpr | UnaryOp unaryexpr ; 32primaryexpr : Identifier | Integer | String | call 33 | arrayaccess | scopeaccess | block 34 | '(' expr ')' 35 | '[' ( exprlist ','? )? ']' ; 36exprlist : expr ( ',' expr )* ; 37elsec : 'else' ; 38comment : COMMENT ; 39 40 41AssignOp : '=' | '+=' | '-=' ; 42UnaryOp : '!' ; 43BinaryOp : '+' | '-' 44 | '<' | '<=' | '>' | '>=' 45 | '==' | '!=' 46 | '&&' 47 | '||' ; 48 49Identifier : LETTER ( DIGIT | LETTER )* ; 50Integer : '-'? DIGIT+ ; 51String : '"' ('\\"'|~'"')* '"' ; 52 53fragment DIGIT : [0-9] ; 54fragment LETTER : ([a-z] | [A-Z] | '_') ; 55COMMENT : '#' ~[\r\n]* '\r'? '\n' -> skip ; 56WS : [ \r\n] -> skip ; 57 58//NLETTER : ~[\r\n$"0-9a-zA-Z_] ; 59//HEX : '0x' [0-9A-Fa-f]+ ; 60 61