CONST -> 'const' VAR -> 'var' PROCEDURE -> 'procedure' CALL -> 'call' BEGIN -> 'begin' END -> 'end' IF -> 'if' THEN -> 'then' WHILE -> 'while' DO -> 'do' ODD -> 'odd' PLUS -> '+' MINUS -> '-' MULTIPLY -> '*' DIVIDE -> '/' ASSIGN -> ':=' EQUALS -> '=' LESS -> '<' NOTEQUALS -> '<>' GREATER -> '>' LESSEQUALS -> '<=' GREATEREQUALS -> '>=' SEMICOLON -> ';' COMMA -> ',' PERIOD -> '.' OPENBRACKET -> '(' CLOSEBRACKET -> ')' ## IDENT -> ([a-z]|[A-Z])([a-z]|([A-Z]|[0-9]))* NUMBER -> ([0-9])+ ## COM -> /\*([A-Z]|([a-z]|([0-9]|\s)))*\*/ ## EOL -> \n|\r SPACE -> \s|\t COM -> /\*!([A-Z]|([a-z]|([0-9]|\s)))*\*/ ## start -> block block -> constlist varlist proclist {print ; print "/*! Main block */";print ;} statement constlist -> EMPTY constlist -> {print "/*! Constant declarations */";print ;} constdec {print lexeme; print ; print ;} varlist -> EMPTY varlist -> {print "/*! Variable declarations */";print ;} vardec {print lexeme; print ; print ;} proclist -> EMPTY proclist -> {print "/*! Procedures */"; print ;} paramlist {print lexeme; print ; print ;} block {print lexeme; print ; print ;} proclist statement -> EMPTY statement -> assignment statement -> callproc statement -> beginend statement -> ifthen statement -> whiledo constdec -> conststate constdec -> conststate constdec vardec -> {print <[IDENT>;} {print lexeme; print ;} vardec -> {print <[IDENT>;} {print lexeme; print ;} vardec paramlist -> EMPTY paramlist -> paramdec assignment -> {print <[IDENT>;} {print lexeme; print ;} expression callproc -> {print <[KEY>;} {print lexeme; print ; print <[IDENT>;} {print lexeme; print ;} vardec beginend -> {print <[KEY>;} {print lexeme; print ; print ; print ;} statement statementlist {print ; print ; print <[KEY>;} {print lexeme; print ;} ifthen -> {print <[KEY>;} {print lexeme; print ;} condition {print <[KEY>;} {print lexeme; print ; print ; print ;} statement {print ;} whiledo -> {print <[KEY>;} {print lexeme; print ;} condition {print <[KEY>;} {print lexeme; print ; print ; print ;} statement {print ;} conststate -> {print <[IDENT>;} {print lexeme; print ;} { print lexeme; print <[CONST>; } {print lexeme; print ; } statementlist -> EMPTY statementlist -> {print lexeme; print ;} statement statementlist condition -> oddexpr condition -> compare expression -> sign term expression -> sign term expression paramdec -> parampart paramdec -> parampart paramdec oddexpr -> expression compare -> expression equalityoper expression sign -> EMPTY sign -> { print <[OP>; } {print lexeme; print ; } sign -> { print <[OP>; } {print lexeme; print ; } term -> factor term -> factor multdiv term parampart -> {print <[KEY>;} {print lexeme; print ;} ilist parampart -> ilist factor -> {print <[IDENT>;} {print lexeme; print ;} factor -> { print <[CONST>; } {print lexeme; print ; } factor -> expression multdiv -> { print <[OP>; } {print lexeme; print ; } multdiv -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } equalityoper -> { print <[OP>; } {print lexeme; print ; } ilist -> {print <[IDENT>;} {print lexeme; print ;} ilist -> {print <[IDENT>;} {print lexeme; print ;} ilist