lex/flex yylineno一直为1的两种解决办法

lex/flex yylineno一直为1的两种解决办法

起因

在使用lex做词法分析的demo时,发现错误并不能准确地定位到行,比如一个语法错误发生在第三行,但yylineno显示为1;于是我又更改了文件,让错误出现在其它行,发现yylineno仍然显示1。

现象描述

其实这是一个类似flex自动设置的东西,即flex有能力管理yylineno,但因为这个开销可能比较大,然后并没有将更新yylineno设置为默认选项。针对此,可以有以下两种解决方式。

方法1

.l文件设计的时候,打开针对此选项的拓展,即添加%option yylineno,这样yylineno就会自动更新。如下图所示:
在这里插入图片描述

方法2

.l文件的头c代码部分引入yylineno变量,并在pattern为[\n]时,action将yylineno加一。因为在使用lex编译.l文件后产生的lex.yy.c文件内会管理yylineno变量,因此我们只需要在.l文件中使用extern关键字引入yylineno变量即可。如下图所示:
在这里插入图片描述