Bison:Getting/Storing 非终结符的值

Bison: Getting/Storing Values of nonterminals

我在 Bison 中写了一个简单的类 C 语法,我遇到了一个奇怪的问题。

在以下规则中:

declaration:        "identifier" length init_values                      
                    {symbolTable.add(,,);}

我想获取 lengthinit_values 的 int 值,它们是非终结符,将它们存储在符号 table 中。 identifier 是一个标记,它的字面值被正确存储。但是,对于其他符号,我得到了一些整数值,例如 66236273。

非终结规则是:

length:             "number" {};                         
init_values:        "number" {};

我尝试直接使用标记而不是非终结符,但解析器无法区分 numberlength 等等。它只是将所有整数解析为 number,这使它崩溃了。

有谁知道如何获得这些的实际值?即我能够在最后一条规则中找到的数字值,但是当解析器返回到第一条规则时,它们以某种方式丢失了。

没有看到更多你的语法和扫描器定义,很难确定你做错了什么。但这里有一些建议:

  1. {symbolTable.add(,,);} 提供的语法规则不正确;它应该是 {symbolTable.add(,,);} 因为右侧的值是从左到右从 </code>.</p></li> 开始计算的 <li><p>假设 <code>"identifier"char *"integer"long (或类似的),重要的是所有终端和使用正确的语义值标记声明非终结符。见 the bison manual.

  2. 不需要length: "number" {};,但由于默认操作实际上是$$ = ,只要length它就不会造成任何伤害和 "number" 使用正确的类型标记声明。我不知道你所说的 "I tried using tokens directly instead of nonterminals" 是什么意思,如果这并不意味着你尝试过 declaration: "identifier" "number" "number";没有理由不这样做(只要类型声明正确)。

  3. 如果要在 yylval 中传递字符串,请确保复制字符串。 yylval.str = yytext; 不正确,会给您带来麻烦。见 this FAQ entry.