c++ - 存储当前被 flex 分析的行

标签 c++ parsing bison flex-lexer

在我的 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/

相关文章:

c++ - Qt 计算器问题 - C++

c++ - 为什么不能从析构函数中抛出异常但可以从复制构造函数中抛出异常?

php - 隐藏 “Creating default object from empty value in”输出

c++ - 如何将头文件放入 Bison 中的 .tab.h?

c - 尝试将GNU GMP库中的类型用作Bison的yylval类型时出错

c++ - Antlr 的优势(相对于 lex/yacc/bison)

C++子类访问主类变量

c++ - 同步非常快的线程

c - 如何使用负浮点进行 sscanf ?

java - 寻找 Java 用户代理字符串解析器