rendered paste body// 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
;