初学者野牛弯曲

时间:2012-09-22 06:09:35

标签: bison lex flex-lexer

如何打印发生错误的行号。我尝试在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

2 个答案:

答案 0 :(得分:2)

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

%{
    int mylineno = 1;
%}
%%
* * * 
\n  { mylineno++; }

答案 1 :(得分:1)

有很多方法可以解决问题,但很难猜出哪一个是相关的。

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

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

  3. 请注意,语法默认情况下不包含词法分析器的信息;您必须确保适当地声明和定义共享信息。