Parsing 来自lexer的值在解析器中显示为一个接一个的值
我刚开始使用野牛,我很难弄清楚它的行为。在一个简单的示例中,我尝试解析字符串“{header:{version:2,type:4}”。我需要从字符串中提取值2和4。当我把规则定义为Parsing 来自lexer的值在解析器中显示为一个接一个的值,parsing,bison,Parsing,Bison,我刚开始使用野牛,我很难弄清楚它的行为。在一个简单的示例中,我尝试解析字符串“{header:{version:2,type:4}”。我需要从字符串中提取值2和4。当我把规则定义为 line_test: T_OPEN_BRACE T_HEADER T_OPEN_BRACE expression T_COMMA expression T_CLOSE_BRACE T_CLOSE_BRACE /* (rule 1) */ ; expression: T_VERSION T_NUMBER { prin
line_test: T_OPEN_BRACE T_HEADER T_OPEN_BRACE expression T_COMMA expression T_CLOSE_BRACE T_CLOSE_BRACE /* (rule 1) */
;
expression: T_VERSION T_NUMBER { printf("returned %d\n", $1); } /* (rule 2) */
| T_TYPE T_NUMBER { printf("returned %d\n", $1); } /* (rule 3) */
;
我得到的是,在第二个规则T_数处的printf计算为0,在第三个规则T_数处的printf计算为2,这意味着这些值以某种方式偏离了它们应该是的适当值
如果我把规则改成
line_test: T_OPEN_BRACE T_HEADER T_OPEN_BRACE expression T_COMMA expression T_CLOSE_BRACE T_CLOSE_BRACE /* (rule 1) */
;
expression: T_VERSION number /* (rule 2) */
| T_TYPE number /* (rule 3) */
;
number: T_NUMBER { printf("returned %d\n", $1); } /* rule 4 */
;
然后,第4个规则处的printf在两次计算中都正确,它首先显示为2,然后显示为4。我查看了bison的状态输出,这一切都是有意义的。我的问题是,为什么第一组语法规则会出现这种意想不到的行为?我可以发布我的lexer或完整的解析器代码,甚至bison状态输出(如果相关)。此规则/操作:
expression: T_VERSION T_NUMBER { printf("returned %d\n", $1); }
打印与令牌相关联的号码T\u VERSION
。因为当您返回t\u VERSION
时,您可能没有在lexer中设置yylval,所以它会得到任何值。您可能想要:
expression: T_VERSION T_NUMBER { printf("returned %d\n", $2); }
它将打印与
T\u号码关联的值
tokengotcha,谢谢您的帮助!我认为$#指的是由于某种原因而与之关联的值。现在,我需要为T_版本和T_类型定义一个%类型,这就是为什么bison抓住我的原因。