Parsing 来自lexer的值在解析器中显示为一个接一个的值

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

我刚开始使用野牛,我很难弄清楚它的行为。在一个简单的示例中,我尝试解析字符串“{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) */
;
我得到的是,在第二个规则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号码关联的值
token

gotcha,谢谢您的帮助!我认为$#指的是由于某种原因而与之关联的值。现在,我需要为T_版本和T_类型定义一个%类型,这就是为什么bison抓住我的原因。