You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
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]+ ; |
|
|
|
|