P → DS {$2.dl=$1.dl}
D1 → var V; D{$$.dl=addlist($2.name,$4.dl)}
|ε {$$.dl=null}
S1 → V:=e; S{check($1.name,$$.dl);
$5.dl=$$.dl}
|ε
V → x {$$.name='x'}
|y {$$.name='y'}
|z {$$.name='z'}
如果采用下面的数据结构attribute定义属性name和dl,可以具体化为:
type struct_attribute {
char *name;
struct_attribute *list;
} attribute;
P → DS {$2.list=$1.list}
D1 → var V; D{$$.list=add_to_list($2.name,$4.list)}
|ε {$$.list=null}
S1 → V:=e; S{check($1.name,$$.list);
$5.list=$$.list}
|ε
V → x {$$.name='x'}
|y {$$.name='y'}
|z {$$.name='z'}
我们这里只把Yacc的原理做了介绍,有关Yacc的使用方法详见讲义(教科书)附录C
|