Bison:Getting/Storing 非终结符的值
Bison: Getting/Storing Values of nonterminals
我在 Bison 中写了一个简单的类 C 语法,我遇到了一个奇怪的问题。
在以下规则中:
declaration: "identifier" length init_values
{symbolTable.add(,,);}
我想获取 length
和 init_values
的 int 值,它们是非终结符,将它们存储在符号 table 中。 identifier
是一个标记,它的字面值被正确存储。但是,对于其他符号,我得到了一些整数值,例如 66236273。
非终结规则是:
length: "number" {};
init_values: "number" {};
我尝试直接使用标记而不是非终结符,但解析器无法区分 number
和 length
等等。它只是将所有整数解析为 number
,这使它崩溃了。
有谁知道如何获得这些的实际值?即我能够在最后一条规则中找到的数字值,但是当解析器返回到第一条规则时,它们以某种方式丢失了。
没有看到更多你的语法和扫描器定义,很难确定你做错了什么。但这里有一些建议:
{symbolTable.add(,,);}
提供的语法规则不正确;它应该是 {symbolTable.add(,,);}
因为右侧的值是从左到右从 </code>.</p></li> 开始计算的
<li><p>假设 <code>"identifier"
是 char *
而 "integer"
是 long
(或类似的),重要的是所有终端和使用正确的语义值标记声明非终结符。见 the bison manual.
不需要length: "number" {};
,但由于默认操作实际上是$$ =
,只要length
它就不会造成任何伤害和 "number"
使用正确的类型标记声明。我不知道你所说的 "I tried using tokens directly instead of nonterminals" 是什么意思,如果这并不意味着你尝试过 declaration: "identifier" "number" "number"
;没有理由不这样做(只要类型声明正确)。
如果要在 yylval
中传递字符串,请确保复制字符串。 yylval.str = yytext;
不正确,会给您带来麻烦。见 this FAQ entry.
我在 Bison 中写了一个简单的类 C 语法,我遇到了一个奇怪的问题。
在以下规则中:
declaration: "identifier" length init_values
{symbolTable.add(,,);}
我想获取 length
和 init_values
的 int 值,它们是非终结符,将它们存储在符号 table 中。 identifier
是一个标记,它的字面值被正确存储。但是,对于其他符号,我得到了一些整数值,例如 66236273。
非终结规则是:
length: "number" {};
init_values: "number" {};
我尝试直接使用标记而不是非终结符,但解析器无法区分 number
和 length
等等。它只是将所有整数解析为 number
,这使它崩溃了。
有谁知道如何获得这些的实际值?即我能够在最后一条规则中找到的数字值,但是当解析器返回到第一条规则时,它们以某种方式丢失了。
没有看到更多你的语法和扫描器定义,很难确定你做错了什么。但这里有一些建议:
{symbolTable.add(,,);}
提供的语法规则不正确;它应该是{symbolTable.add(,,);}
因为右侧的值是从左到右从</code>.</p></li> 开始计算的 <li><p>假设 <code>"identifier"
是char *
而"integer"
是long
(或类似的),重要的是所有终端和使用正确的语义值标记声明非终结符。见 the bison manual.不需要
length: "number" {};
,但由于默认操作实际上是$$ =
,只要length
它就不会造成任何伤害和"number"
使用正确的类型标记声明。我不知道你所说的 "I tried using tokens directly instead of nonterminals" 是什么意思,如果这并不意味着你尝试过declaration: "identifier" "number" "number"
;没有理由不这样做(只要类型声明正确)。如果要在
yylval
中传递字符串,请确保复制字符串。yylval.str = yytext;
不正确,会给您带来麻烦。见 this FAQ entry.