如何打印发生错误的行号。我尝试在yylineno
函数中使用yyerror()
并在%option yylineno
文件中编写.l
但在编译之后会给我一个错误“yylineno undeclared (first use in this function)
”并且如果我初始化yylineno
为1,它给了我这个错误:
error: redefinition of yylineno
lex.yy.c:273: note: previous definition of yylineno was here
答案 0 :(得分:2)
有第二种方法要求flex提供全局变量yylineno:命令行开关-l
。如果这对您不起作用,您可以管理自己的全局,如Levine等。提示。在与换行符匹配的任何规则中增加它。
%{
int mylineno = 1;
%}
%%
* * *
\n { mylineno++; }
答案 1 :(得分:1)
有很多方法可以解决问题,但很难猜出哪一个是相关的。
您具有在Flex源(.l
文件中定义的变量和从源创建的目标文件),但您没有在Bison语法(.y
文件中声明它)或标题,因此在编译语法时它是未声明的。
你确实在语法中声明了它,但你仍然遇到问题。从语法或词法分析器生成的.c
文件中的片段顺序可能与您的预期不同,因此您最终会在声明变量之前引用该变量。引用它的代码可能出现在%{ ... %}
块中,它可能出现在第二个%%
节标记之后,它可能出现在其中一个语法(或词法分析器)操作块中,或者它可能出现在源中的其他位置。如果引用yylineno
变量的每一个都在块中有一个纯声明(最好是通过标题),那么代码应该没问题。你试图消除重复,但冒着重复自己的风险(如果你的标题是幂等的,这不应该是一个大问题),你可以确保在所有适当的部分声明它。
请注意,语法默认情况下不包含词法分析器的信息;您必须确保适当地声明和定义共享信息。