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]+ ;