Answers to January 2002 CS2121 Exam Q1

(Parts in italics are just my working out loud, that I wouldn't expect to see in real exam answers.)

a)

i)

brackets around highest precedence operations -> a-b-(c/d/e)
bracket left-to-right ->
(a-b)-((c/d)/e)
        -
     /     \
   -     divide
 /  \     /   \
a    b divide  e
      /     \
     c       d

ii)

brackets around highest precedence operations -> (a-b-c)/d/e
bracket right-to-left ->
(a-(b-c))/(d/e)
   divide
   /    \
  -    divide
 / \    / \
a   -  d   e
   / \
  b   c

b)

lex:
[A-Za-z][A-Za-z0-9]*	{yylval.i=strdup(yytext); return id;}
[0-9]+			{yylval.n=atoi(yytext); return number;}
[()-/]			{return yytext[0];}
[ \t\n]			;
.			{ECHO; yyerror("unexpected\n");}
yacc:
%token <n> number
%token <i> id
%union {int n; char *i;}
%start exp
%%
exp: term | exp '-' term ;
term: factor | term '/' factor ;
factor: id | number | '(' exp ')' ;
or:
%token <n> number
%token <i> id
%union {int n; char *i;}
%start exp
%left '-'
%left '/'
%%
exp: exp '-' exp | exp '/' exp | id | number | '(' exp ')' ;

c)


each precedence level is in a separate rule, and the %start rule (exp) has lowest priority (is recognised last) and left associativity corresponds to left recursion
change to right-recursion, and put lowest priority operator into %start rule (exp):
exp: term | term '/' exp ;
term: factor | factor '-' term ;
factor: id | number | '(' exp ')' ;

or:
%left gives left associativity, and the last such rule has highest priority
use %right, and put lowest priority operator in first such:
%right '/'
%right '-'