存储flex正在分析的当前行

Storing the current line being analysed by flex

本文关键字:flex 存储      更新时间:2023-10-16

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

我当然可以使用一个向量来做到这一点,并在词法分析之前/之后从文件中读取所有行,但这只会增加解析文件所需的时间。我认为我可以做的是,在匹配新行字符时存储该行,并将当前行插入到向量中。所以我的问题是,是否有一个变量/宏,flex存储当前行?(比如yyline)

注意:我也使用野牛

lex/flex本身并不能满足您的要求。如前所述,您需要它来报告错误消息。(我在vi中这样做,如emacs)。使用lex/flex, 存储整行的唯一方法是中的每个标记从当前行记录到您自己的行缓冲区中。这可能会很复杂,特别是如果词法分析器必须处理多行内容(如注释或字符串)。

yytext变量只显示最近解析的令牌(以及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

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