0

我正在阅读一些用于解析 C 程序的 Bison 代码。谁能告诉我下面代码中 $7 和 $8 的含义,因为我在两种情况下只找到了 6 和 7 描述来描述枚举类型。

enum_name:
      enum_key
      gcc_type_attribute_opt
      {
        init($$);
        PARSER.new_declaration(stack($1), symbol, stack($$), true);
        PARSER.copy_item(to_ansi_c_declaration(stack($$)));
      }
      '{' enumerator_list '}'
      gcc_type_attribute_opt
    {

      // throw in the gcc attributes
      merge_types($$, $2);
      merge_types($$, $7);

      do_enum_members((const typet &)stack($$), stack($5));
    }
    | enum_key
      gcc_type_attribute_opt
      identifier_or_typedef_name
      {
        init($$);
        PARSER.new_declaration(stack($1), stack($3), stack($$), true);
        PARSER.copy_item(to_ansi_c_declaration(stack($$)));
      }
      '{' enumerator_list '}'
      gcc_type_attribute_opt
    {
      // throw in the gcc attributes
      merge_types($$, $2);
      merge_types($$, $8);

      do_enum_members((const typet &)stack($$), stack($6));
    };
4

1 回答 1

1

当您编写规则时,令牌和其他规则的编号从$1. 任何嵌入的代码块也有一个编号。因此,您的代码中的第一个替代方案,我们有(概述):

enum_name:
        enum_key gcc_type_attribute_opt { ... } '{' enumerator_list '}'
        gcc_type_attribute_opt { ... }

这里,enum_keyis $1gcc_type_attribute_optis $2,第一个代码块{ ... }$3'{'is $4enumerator_listis $5}is $6gcc_type_attribute_optis $7,最后一个代码块是$8。如果规则返回值,您可以使用$n符号找到这些值。

因此,在作为最后一个代码块的动作中,$2是第一个gcc_type_attribute_opt$7是第二个,$5enumerator_list.

第二种方案的分析类似。

讨论的关键是嵌入的代码块也被分配了一个数字;既然你不知道,你会被数数弄糊涂的。

于 2013-05-16T21:38:33.943 回答