【问题标题】:Yacc actions return 0 for any variable ($)Yacc 操作对任何变量 ($) 都返回 0
【发布时间】:2017-11-14 19:29:30
【问题描述】:

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

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

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

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

我在这里打印出来了:

I_CONSTANT 0

即使我的输入是:

int foo(int x)
{
    return 5;
}

有什么想法吗?

【问题讨论】:

  • 对于I_CONSTANT,词法分析器通过yylval返回实际值?或许您应该首先考虑一些关于 Lex 和 Yacc 的教程?
  • @Someprogrammerdude 知道了。谢谢!

标签: c yacc lex


【解决方案1】:

您指向的 lex 文件中没有任何内容实际上为任何标记设置语义值。正如作者所说,这些文件只是一个语法,“大部分工作”仍然需要完成。 (还有其他与预处理器的需求有关的警告。)

由于 lex 文件中没有任何内容设置过 yylval,因此它将始终为 0,这就是 yacc/bison 在设置令牌的语义值时会找到的值(在本例中为 $1)。

【讨论】:

    【解决方案2】:

    原来yylval = atoi(yytext) 没有在 lex 文件中完成,所以我不得不自己添加它。还了解到我可以在yacc文件头添加extern char *yytext,然后直接使用yytext

    【讨论】:

    • 不要在你的野牛文件中使用yytext。它通常不会具有正确的值(即使它似乎在一种特定情况下有效。)并且不要向其他任何人建议他们这样做。这是等待中的一个大错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多