来自词法分析器的值在预期的值之后出现在解析器中的一个值

时间:2014-01-08 23:58:08

标签: 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 { 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.我查看了野牛的状态输出,这一切都有意义。我的问题是,为什么第一组语法规则出现这种意外行为?我可以发布我的词法分析器或完整的解析器代码,甚至是相关的野牛状态输出。

1 个答案:

答案 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令牌

关联的值