存储flex正在分析的当前行
Storing the current line being analysed by flex
在flex生成的解析器中,我希望能够存储文件中的每一行,以便在报告错误时,我可以向用户显示发生错误的行。
我当然可以使用一个向量来做到这一点,并在词法分析之前/之后从文件中读取所有行,但这只会增加解析文件所需的时间。我认为我可以做的是,在匹配新行字符时存储该行,并将当前行插入到向量中。所以我的问题是,是否有一个变量/宏,flex存储当前行?(比如yyline
)
注意:我也使用野牛
lex/flex本身并不能满足您的要求。如前所述,您需要它来报告错误消息。(我在vi中这样做,如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
值将在解析给定令牌的结尾处。
虽然在错误消息中报告上下文中的整行很好,但是跟踪每个标记的行号和列号也很有用——各种编辑器可以处理像这样的行
filename:line:col:message
如果您通过跟踪标记来构建行缓冲区,那么跟踪每个标记开始的列也可能相对简单。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 存储flex正在分析的当前行