grammar SimpleA1; @header { package intermediate.antlr4; } /*----------------- */ /* Production rules */ /*----------------- */ program : programHeader block '.' ; programHeader : PROGRAM identifier ';' ; block : declarations compoundStatement ; declarations : ; identifier : IDENTIFIER ; statement : compoundStatement | assignmentStatement | repeatStatement | writeStatement | writelnStatement | emptyStatement ; emptyStatement : /* empty */ ; compoundStatement : BEGIN statementList END ; statementList : statement ( ';' statement )* ; assignmentStatement : variable ':=' expression ; repeatStatement : REPEAT statementList UNTIL expression ; writeStatement : WRITE writeArguments ; writelnStatement : WRITELN writeArguments? ; writeArguments : '(' writeArgument (',' writeArgument)* ')' ; writeArgument : expression (':' format)? ; format : width (':' precision)? ; width : sign? integerConstant ; precision : integerConstant ; sign : '-' | '+' ; expression : simpleExpression (relOp simpleExpression)? ; simpleExpression : sign? term (addOp term)* ; term : factor (mulOp factor)* ; factor : variable | unsignedConstant | characterConstant | stringConstant | NOT factor | '(' expression ')' ; relOp : '=' | '<>' | '<' | '<=' | '>' | '>=' ; addOp : '+' | '-' | OR ; mulOp : '*' | '/' | DIV | MOD | AND ; variable : identifier ; unsignedConstant : integerConstant | realConstant ; integerConstant : INTEGER ; realConstant : REAL; characterConstant : CHARACTER ; stringConstant : STRING ; /*------------------ */ /* Token definitions */ /*------------------ */ PROGRAM : 'PROGRAM' ; BEGIN : 'BEGIN' ; END : 'END' ; DIV : 'DIV' ; MOD : 'MOD' ; AND : 'AND' ; OR : 'OR' ; NOT : 'NOT' ; REPEAT : 'REPEAT' ; UNTIL : 'UNTIL' ; WRITE : 'write' ; WRITELN : 'writeln' ; IDENTIFIER : LETTER ( LETTER | DIGIT )*; INTEGER : DIGITS ; REAL : DIGITS '.' DIGITS | DIGITS ('e' | 'E') ('+' | '-')? DIGITS | DIGITS '.' DIGITS ('e' | 'E') ('+' | '-')? DIGITS ; LETTER : [a-zA-Z] ; DIGIT : [0-9]; DIGITS : DIGIT+ ; WHITESPACE : [ \n\r\t]+ -> skip ; COMMENT : '{' COMMENT_CHAR* '}' -> skip ; QUOTE : '\'' ; CHARACTER : QUOTE CHARACTER_CHAR QUOTE ; STRING : QUOTE STRING_CHAR* QUOTE ; fragment CHARACTER_CHAR : ~('\'') // any non-quote character ; fragment STRING_CHAR : QUOTE QUOTE // two consecutive quotes | CHARACTER_CHAR ; fragment COMMENT_CHAR : ~'}' ; // any character except }