Our version of YACC has a tracing facility that we can use to see
how it treats left-recursive and right-recursive grammars - e.g. when
recognising a , b , c as a list of identifiers.
Example parse trace for list : id | list ',' id ;
.... look ahead at id 'a'
id <-- 'a'
|
list
| .... look ahead at ','
| ',' <-- ','
| | .... look ahead at id 'b'
| | id <-- 'b'
+------+------+
list
| .... look ahead at ','
| ',' <-- ','
| | .... look ahead at id 'c'
| | id <-- 'c'
+------+------+
list
| .... look ahead at END
Example parse trace for list : id | id ',' list ;
.... look ahead at id 'a'
id <-- 'a'
| .... look ahead at ','
| ',' <-- ','
| | .... look ahead at id 'b'
| | id <-- 'b'
| | | .... look ahead at ','
| | | ',' <-- ','
| | | | .... look ahead at id 'c'
| | | | id <-- 'c'
| | | | | .... look ahead at END
| | | | list
| | +------+------+
| | list
+------+------+
list
|