存储当前正在被 flex 分析的行

Storing the current line being analysed by flex

在我的 flex 生成的解析器中,我希望能够存储文件中的每一行,以便在报告错误时,我可以向用户显示发生错误的行。

我当然可以使用向量并从文件 before/after 词法分析中读取所有行来执行此操作,但这只会增加解析文件所需的时间。 我认为我可以做的是在匹配换行符时存储该行,并将当前行插入到向量中。所以我的问题是,是否有一个variable/macro flex 将当前行存储在里面? (可能类似于 yyline

注:我也在用bison

lex/flex 本身并没有按照您的要求进行。如前所述,您希望它用于报告错误消息。 (我在 vi like emacs 中做了类似的事情)。

使用lex/flex,存储整行的唯一方法是记录当前行中的每个标记到你自己的行缓冲区。这可能会很复杂,尤其是当您的词法分析器必须处理多行内容(例如注释或字符串)时。

yytext变量只显示最近解析的token(和yylength,相应的长度)。如果你的词法分析器做了一个简单的 ECHO,那就是一个标记,就像你所关注的那样。

如前所述提前阅读文件是简化问题的一种方法。在像 emacs 这样的 vi 中,词法分析器通过函数从内存缓冲区而不是从输入流读取。它通过重新定义 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

如果您通过跟踪标记建立行缓冲区,跟踪每个标记开始的列也可能相对简单。