我刚刚开始使用野牛,并且无法弄清楚行为。在一个简单的例子中,我有一个我试图解析的字符串“{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 { printf("returned %d\n", $1); } /* (rule 2) */
| T_TYPE T_NUMBER { printf("returned %d\n", $1); } /* (rule 3) */
;
我得到的是,在第二条规则的printf处,T_NUMBER评估为0,并且在第三条规则的printf处,T_NUMBER评估为2,这意味着这些值以某种方式从它们应该的适当值转移。 / p>
如果我将规则更改为
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 */
;
然后第四个规则的printf被正确评估两次,它首先显示2,然后是4.我查看了野牛的状态输出,这一切都有意义。我的问题是,为什么第一组语法规则出现这种意外行为?我可以发布我的词法分析器或完整的解析器代码,甚至是相关的野牛状态输出。
答案 0 :(得分:1)
此规则/行动:
expression: T_VERSION T_NUMBER { printf("returned %d\n", $1); }
打印与令牌T_VERSION
关联的数字。因为当你返回T_VERSION
时你可能没有在词法分析器中设置yylval,所以它会得到任何值。你可能想要:
expression: T_VERSION T_NUMBER { printf("returned %d\n", $2); }
打印与T_NUMBER
令牌