We need to define three different precedence relations between pairs of terminals as follows:
relation meaning a <. b a yields precedence to b a =. b a has the same precedence as b a >. b a takes precedence over bNote: When discussing precedence relations, the symbols <., =., and >. have a set of meanings quite different than the relational operators <, ==, and >.
Consider the following grammar:
E -> E + T | T T -> T * F | F F -> idSuppose we have the following right-sentential string and precedence relations:
right-sentential form: id+id*id
Precedence relations:
Input
id + * $ Token Class
id >. >. >. id is 0
+ <. >. <. >. + is 1
Stack * <. >. >. >. * is 2
$ <. <. <. accept $ is 3
So here's the deal. We want to identify each handle using the precedence rules and reduce the right-sentential string, based on the precedence relations, to a start (accept) state.Using Algorithm 4.5 on p. 206, if we look at the string id+id*id and the above precedence relations and output each handle as it is produced substituting a dummy class of 99 for each nonterminal, we would get the following result.
Note: E is a dummy class
Handle Stack Input String Reason
(top to the right)
$ id+id*id$ Initialized
$id +id*id$ $ <. id
0 $E +id*id$ id >. +
$E+ id*id$ $ <. +
$E+id *id$ + <. id
0 $E+E *id$ id >. *
$E+E* id$ + <. id
$E+E*id $ * <. id
0 $E+E*E $ id >. $
99 2 99 $E+E $ * >. $
99 1 99 $E $ + > $
RETURN $ =. $
Next we will examine the following grammar:
E -> E + T | T T -> T * F | F F -> ( E ) | id