• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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