Yacc actions return 0 对于任何变量 ($)

Yacc actions return 0 for any variable ($)

我是 Lex/Yacc 的新手。找到这些 lex & yacc 解析 ansi C 的文件。

为了实验,我添加了一个动作来打印部分解析:

constant
    : I_CONSTANT    { printf("I_CONSTANT %d\n", ); }
    | F_CONSTANT
    | ENUMERATION_CONSTANT  /* after it has been defined as such */
    ;

问题是,无论我把动作放在哪里,无论我使用什么 $X,我得到的值总是 0。

我在这里打印:

I_CONSTANT 0

尽管我的输入是:

int foo(int x)
{
    return 5;
}

有什么想法吗?

您指向的 lex 文件中没有任何内容实际为任何标记设置语义值。正如作者所说,这些文件只是一个语法,"the bulk of the work" 仍然需要完成。 (还有其他注意事项与预处理器的需要有关。)

因为 lex 文件中没有任何内容设置 yylval,它将始终为 0,这就是 yacc/bison 在设置标记的语义值时会发现的内容 ( 在这种情况下)。

原来lex文件里没有做yylval = atoi(yytext),只好自己加了。还了解到我可以在yacc文件头加上extern char *yytext,然后直接使用yytext