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