53 lines
1.2 KiB
Plaintext
53 lines
1.2 KiB
Plaintext
|
grammar xlang;
|
||
|
|
||
|
file : function+ EOF;
|
||
|
function : Identifier LeftParen argumentList? RightParen block;
|
||
|
argumentList : Identifier (Comma Identifier)*;
|
||
|
block : LeftBrace statement* RightBrace;
|
||
|
statement : Identifier Assign expr Semicolon
|
||
|
| If expr block (Else block)?
|
||
|
| While expr block
|
||
|
| Return expr Semicolon
|
||
|
| Print expr Semicolon
|
||
|
| expr Semicolon
|
||
|
;
|
||
|
expr : sum ((Less|LessEqual|Greater|GreaterEqual|Equal|NotEqual) sum)*;
|
||
|
sum : term ((Plus|Minus) term)*;
|
||
|
term : factor ((Mul|Div) factor)*;
|
||
|
factor : Integer
|
||
|
| Identifier
|
||
|
| Identifier LeftParen exprList? RightParen
|
||
|
| LeftParen expr RightParen
|
||
|
;
|
||
|
exprList : expr (Comma expr)*;
|
||
|
|
||
|
If : 'if';
|
||
|
Else : 'else';
|
||
|
While : 'while';
|
||
|
Return : 'return';
|
||
|
Print : 'print';
|
||
|
|
||
|
LeftParen : '(';
|
||
|
RightParen : ')';
|
||
|
LeftBrace : '{';
|
||
|
RightBrace : '}';
|
||
|
Assign : '=';
|
||
|
Less : '<';
|
||
|
LessEqual : '<=';
|
||
|
Greater : '>';
|
||
|
GreaterEqual : '>=';
|
||
|
Equal : '==';
|
||
|
NotEqual : '!=';
|
||
|
Plus : '+';
|
||
|
Minus : '-';
|
||
|
Mul : '*';
|
||
|
Div : '/';
|
||
|
Comma : ',';
|
||
|
Semicolon : ';';
|
||
|
|
||
|
Identifier : [a-zA-Z][a-zA-Z0-9]*;
|
||
|
Integer : [0-9]+;
|
||
|
|
||
|
Comment : '//' ~[\n]* '\n' -> skip;
|
||
|
Whitespace : [ \t\r\n]+ -> skip;
|