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