存储flex正在分析的当前行

时间:2015-05-16 08:16:28

标签: c++ parsing bison flex-lexer

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

我当然可以使用向量来执行此操作并在lexing之前/之后读取文件中的所有行,但这只会增加解析文件所需的时间。 我认为我可以做的是,每当匹配换行符时都存储该行,并将当前行插入向量中。所以我的问题是,是否有一个变量/宏可以将当前行存储在内部? (或许像yyline

注意:我也在使用野牛

1 个答案:

答案 0 :(得分:2)

lex / flex本身并不能满足你的要求。如上所述,您希望这用于报告错误消息。 (我在 vi like emacs 中做了类似的事情。)

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

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

如前所述,提前阅读文件是简化问题的一种方法。在像 这样的 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值将位于解析给定标记的 end

虽然在错误消息中报告上下文中的整行是很好的,但跟踪每个令牌的行号和列号也很有用 - 各种编辑器可以处理这样的行

filename:line:col:message

如果通过跟踪令牌来构建行缓冲区,则跟踪每个令牌开始的列可能相对简单。