2

如何打印发生错误的行号。我尝试yylinenoyyerror()函数中使用并%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
4

2 回答 2

2

还有第二种方法可以让 flex 提供全局变量 yylineno:命令行 switch -l。如果这对您不起作用,您可以管理自己的全局,如 Levine 等人。建议。在任何匹配换行符的规则中增加它。

%{
    int mylineno = 1;
%}
%%
* * * 
\n  { mylineno++; }
于 2012-09-23T03:20:36.373 回答
1

您可能会遇到多种问题,但很难猜测哪一种是相关的。

  1. 您在 Flex 源(.l文件和从源创建的目标文件)中定义了变量,但您没有在 Bison 语法(.y文件)或标头中声明它,因此在编译语法时它是未声明的。

  2. 您确实在语法中声明了它,但您仍然遇到问题。从语法或词法分析器生成的文件中片段的顺序.c可能不是您所期望的,因此您最终会在声明变量之前引用它。引用它的代码可能出现在一个%{ ... %}块中,它可能出现在第二个%%部分标记之后,它可能出现在一个语法(或词法分析器)操作块中,或者它可能出现在源代码中的某个其他位置。如果这些中的每一个都引用了yylineno变量在块中有一个纯声明(最好通过标题),那么代码应该没问题。您尝试消除重复,但冒着重复自己的风险(如果您的标头是幂等的,这应该不是一个大问题),您可以确保在所有适当的部分中声明它。

请注意,默认情况下,语法不包括来自词法分析器的信息;您必须确保正确声明和定义共享信息。

于 2012-09-23T07:43:16.957 回答