在我的 flex 生成的解析器中,我希望能够存储文件中的每一行,以便在报告错误时,我可以向用户显示发生错误的行。
我当然可以使用 vector 来执行此操作,并在词法分析之前/之后从文件中读取所有行,但这只会增加解析文件所需的时间。
我认为我可以做的是在匹配换行符时存储该行,并将当前行插入到 vector 中。所以我的问题是,是否有一个变量/宏 flex 将当前行存储在里面? (可能类似于 yyline
)
注:我也在用bison
最佳答案
就其本身而言,lex/flex 不会按照您的要求进行操作。如前所述,您希望它用于报告错误消息。 (我在 vi like emacs 中做了类似的事情)。
使用 lex/flex,存储整行的唯一方法是记录当前行中的每个标记到您自己的行缓冲区中。这可能会很复杂,尤其是当您的词法分析器必须处理多行内容(例如注释或字符串)时。
yytext
变量只显示最近解析的标记(和 yylength
,相应的长度)。如果您的词法分析器执行简单的 ECHO
,那么这就是您所关注的标记。
如前所述提前阅读文件是简化问题的一种方法。在 vi like emacs 中,词法分析器通过函数从内存缓冲区中读取,而不是从输入流中读取。它通过重新定义 YY_INPUT
宏来绕过正常的流处理逻辑,例如,
#define YY_INPUT(buf,result,max_size) result = flt_input(buf,max_size)
同样,ECHO
被重新定义(因为编辑器读回结果而不是让它们进入标准输出):
#define ECHO flt_echo(yytext, yyleng)
并且它用另一个重新定义来捕获词法分析器检测到的错误:
#define YY_FATAL_ERROR(msg) flt_failed(msg);
无论您如何执行此操作,为给定标记报告的 yylineno
值将在解析给定标记的结束。
虽然在错误消息中报告上下文中的整行很好,但跟踪每个标记的行号和列号也很有用——不同的编辑器可以处理这样的行
filename:line:col:message
如果您通过跟踪标记来构建行缓冲区,那么跟踪每个标记开始的列也可能相对简单。
关于c++ - 存储当前被 flex 分析的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273371/