在我的flex生成的解析器中,我希望能够将每一行存储在文件中,这样在报告错误时,我可以向用户显示错误发生的行。
我当然可以使用向量来执行此操作并在lexing之前/之后读取文件中的所有行,但这只会增加解析文件所需的时间。
我认为我可以做的是,每当匹配换行符时都存储该行,并将当前行插入向量中。所以我的问题是,是否有一个变量/宏可以将当前行存储在内部? (或许像yyline
)
注意:我也在使用野牛
答案 0 :(得分:2)
lex / flex本身并不能满足你的要求。如上所述,您希望这用于报告错误消息。 (我在 vi like emacs 中做了类似的事情。)
使用lex / flex,存储整行的唯一方法是记录每个令牌从当前行到您自己的行缓冲区。这可能很复杂,特别是如果你的词法分析器必须处理多行内容(例如注释或字符串)。
yytext
变量仅显示最近解析的令牌(和yylength
,相应的长度)。如果你的词法分析器做了一个简单的ECHO
,那就像你注意的那样一个标记。
如前所述,提前阅读文件是简化问题的一种方法。在像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
如果通过跟踪令牌来构建行缓冲区,则跟踪每个令牌开始的列可能相对简单。