Last Update Time-stamp: "97/06/27 19:22:22 umrigar"
The grammar is for a simple language consisting of assignment statements
ID:= expr separated by ;'s. Expressions
can contain parentheses, numbers and identifiers with the binary operators
+, -, *, /,
mod and div having the usual precedences. The
grammar follows:
program
: stmts
;
stmts
: assgnStmt
| assgnStmt ';' stmts
;
assgnStmt
: ID ':=' expr
;
expr
: expr '+' term
| expr '-' term
| term
;
term
: term '*' factor
| term '/' factor
| term 'div' factor
| term 'mod' factor
| factor
;
factor
: '(' expr ')'
| ID
| NUM
;
Unfortunately, the above grammar is left-recursive and hence is not amenable to top-down parsing. If we use the standard grammar transformations to remove the left recursion, we get the following grammar:
$S: /* Rule 0 */
program
<EOF>
program: /* Rule 1 */
stmts
stmts: /* Rule 2 */
assgnStmt
stmtsRest
stmtsRest: /* Rule 3 */
';'
stmts
stmtsRest: /* Rule 4 */
/* EMPTY */
assgnStmt: /* Rule 5 */
ID
':='
expr
expr: /* Rule 6 */
term
exprRest
exprRest: /* Rule 7 */
'+'
term
exprRest
exprRest: /* Rule 8 */
'-'
term
exprRest
exprRest: /* Rule 9 */
/* EMPTY */
term: /* Rule 10 */
factor
termRest
termRest: /* Rule 11 */
'*'
factor
termRest
termRest: /* Rule 12 */
'/'
factor
termRest
termRest: /* Rule 13 */
DIV
factor
termRest
termRest: /* Rule 14 */
MOD
factor
termRest
termRest: /* Rule 15 */
/* EMPTY */
factor: /* Rule 16 */
'('
expr
')'
factor: /* Rule 17 */
ID
factor: /* Rule 18 */
NUM
Feedback: Please email any feedback to zdu@acm.org.