1
0
antlr-compiler/Demo.g4

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: '"' .*? '"';