CS2112: Exercises + Answers from $8 Parse Trees

For these questions, you really need to get the code & play with it.

* Alter the associativity and precedence of the operators in $8.2 and generate the resulting parse trees.

I would rewrite the yacc to use %left etc., so it is easy to modify the precedence etc.:

 %left '+' '-'
 %left `*` `/`
 %%
 input	: exp			{printtree ($1, 1);}
 	;
 exp	: '+' exp		{$$ = $2;}
 	| '-' exp		{$$ = make_operator (NULL, '~', $2);}
 	| exp '+' exp	  	{$$ = make_operator ($1, '+', $3);}
 	| exp '-' exp		{$$ = make_operator ($1, '-', $3);}
 	| exp '*' exp		{$$ = make_operator ($1, '*', $3);}
 	| exp '/' exp		{$$ = make_operator ($1, '/', $3);}
	| number		{$$ = make_number ($1);}
 	| variable		{$$ = make_variable ($1);}
 	| '(' exp ')'		{$$ = $2;}
 	;

+ Add extra language features (e.g. function calls, array accesses, conditional expressions) to the grammar in $8.2 and build the corresponding parse trees.

e.g. simple function calls:

 enum treetype {operator_node, number_node, variable_node, call_node};

 typedef struct tree {
   enum treetype nodetype;
   union {
     struct {struct tree *left, *right; char operator;} an_operator;
     struct {struct tree *func, *param;} a_call;
     int a_number;
     char a_variable;
   } body;
 } tree;

 static tree *make_call (tree *f, tree *p)
 {
   tree *result= (tree*) malloc (sizeof(tree));
   result->nodetype= call_node;
   result->body.a_call.func= f;
   result->body.a_call.param= p;
   return result;
 }

 factor : number		{$$ = make_number ($1);}
 	| variable		{$$ = make_variable ($1);}
 	| '(' exp ')'		{$$ = $2;}
 	| variable '(' exp ')'	{$$ = make_call ($1, $3);}
 	;

Although it would be better to allow a variable number of parameters (c.f. lab ex 6)

e.g. a (b, c)

   call
  /     \
 a       b
           \
            c