60 lines
1.7 KiB
ANTLR
60 lines
1.7 KiB
ANTLR
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: '"' .*? '"';
|