60 lines
1.7 KiB
Plaintext
60 lines
1.7 KiB
Plaintext
|
grammar Demo;
|
||
|
|
||
|
program: programPart+;
|
||
|
|
||
|
programPart: statement #MainStatement
|
||
|
| functionDefinition #ProgPartFunctionDefinition
|
||
|
;
|
||
|
|
||
|
statement : println ';'
|
||
|
| print ';'
|
||
|
| varDeclaration ';'
|
||
|
| assignment ';'
|
||
|
| branch
|
||
|
;
|
||
|
|
||
|
branch : 'if' '(' condition=expression ')' onTrue=block 'else' onFalse=block ;
|
||
|
|
||
|
block : '{' statementList '}' ;
|
||
|
|
||
|
expression: left=expression '/' right=expression #Div
|
||
|
| left=expression '*' right=expression #Mult
|
||
|
| left=expression '-' right=expression #Minus
|
||
|
| left=expression '+' right=expression #Plus
|
||
|
| left=expression operator=('<' | '<=' | '>' | '>=') right=expression #Relational
|
||
|
| left=expression operator='&&' right=expression #And
|
||
|
| left=expression operator='||' right=expression #Or
|
||
|
| number=NUMBER #Number
|
||
|
| txt=STRING #String
|
||
|
| varName=IDENTIFIER #Variable
|
||
|
| functionCall #FuncCallExpression
|
||
|
;
|
||
|
|
||
|
varDeclaration: 'int' varName=IDENTIFIER ;
|
||
|
|
||
|
assignment: varName=IDENTIFIER '=' expr=expression ;
|
||
|
|
||
|
println: 'println(' argument=expression ')' ;
|
||
|
|
||
|
print: 'print(' argument=expression ')' ;
|
||
|
|
||
|
functionDefinition: 'int' funcName=IDENTIFIER '(' params=parameters')' '{' statements=statementList 'return' retValue=expression ';' '}' ;
|
||
|
|
||
|
statementList : (statement)* ;
|
||
|
|
||
|
parameters:
|
||
|
| declarations+=varDeclaration (',' declarations+=varDeclaration)*
|
||
|
;
|
||
|
|
||
|
functionCall: funcName=IDENTIFIER '(' args=expressionList ')';
|
||
|
|
||
|
expressionList:
|
||
|
| expressions+=expression (',' expressions+=expression)*
|
||
|
;
|
||
|
|
||
|
// Terminals
|
||
|
IDENTIFIER: [A-Za-z][A-Za-z0-9]*;
|
||
|
NUMBER: [0-9]+;
|
||
|
WHITESPACE: [ \t\n\r]+ -> skip;
|
||
|
STRING: '"' .*? '"';
|