// COMS22201: Syntax analyser class Syn extends Parser; options { importVocab = Lex; buildAST = true; } program : PROGRAM^ programname SEMICOLON! block PERIOD! ; programname : IDENTIFIER ; block : ( VAR^ declarations )? compoundstatement ; declarations : ( idlist COLON! type SEMICOLON! )+ ; idlist: IDENTIFIER ( COMMA! IDENTIFIER )* ; type: REAL | INTEGER ; compoundstatement : BEGIN^ ( statement SEMICOLON! )* END! ; statement : WRITE^ OPENPAREN! ( STRING | expression ) CLOSEPAREN! | WRITELN | READ^ OPENPAREN! variable CLOSEPAREN! | variable EQUALS expression ; expression: unaryop term (( PLUS | MINUS ) term )* ; unaryop: ( PLUS | MINUS )? ; term: factor (( MULTIPLY | DIVIDE ) factor )* ; factor: variable | constant | OPENPAREN! expression CLOSEPAREN! ; constant: REALNUM | INTEGERNUM ; variable : IDENTIFIER ;