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
。
我是 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
。