bison - 为什么 Bison 总是输出大于号?如何省略它?
问题描述
我创建了一个 Bison 解析器来将输入数据转换为 XML。每当我运行解析器时,输出都会包含 XML,并且 XML 之后是这个符号:
>
哎呀!该大于号使 XML 格式不正确。
是什么产生了大于符号?我如何告诉 Bison 不要生成它?我认为我的“主要”函数中没有任何内容可以告诉 Bison 输出大于符号:
int main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
yyparse();
fclose(yyin);
return 0;
}
解决方案
猜测一下,您正在使用 (f)lex 并且您的词法分析器模式都不匹配>
,因此使用默认操作。(f)lex 默认操作是在 上打印不匹配的字符yyout
,这通常是不可取的。
我建议始终%option nodefault
在您的 flex 文件中使用。如果有任何事情可能触发默认规则(并将默认规则更改为致命错误),这将导致 flex 发出警告。不幸的是,它实际上并没有告诉您哪些字符无法匹配,但是您应该能够通过查看规则来弄清楚这一点。
一个好的调试技术是编译带有调试跟踪的扫描仪版本,然后编写一个简单的包装器,它只是yylex
在循环中调用直到它返回 0。(打印出返回的标记是更多的工作,但也很有用。)使用测试输入运行它,直到您对扫描仪按预期工作感到满意为止。
Bison 也有一个跟踪工具,在野牛手册的“调试你的解析器”一章中有描述。它还可以帮助您调试扫描仪问题,但您必须经历更多的调试日志记录。
推荐阅读
- snowflake-cloud-data-platform - 我们如何在 Snowflake 中使用子查询,从 (select....) 中选择列失败
- stm32 - STM32F4 - 丢失来自 max30100 的 FIFO 数据样本
- c# - 取消 Abot 上的站点抓取
- machine-learning - 值错误:训练折叠中只有 2 个类/es,但整个数据集中有 1 个。具有不平衡折叠的决策函数不支持此功能
- c# - 如何绑定数据库中的图像并在gridview中显示图像?
- batch-file - 有没有办法获取使用 taskkill /f /fi “status eq notresponsive”杀死的进程的名称?
- sql - 获取连接中的最后一个条目
- python - 在 python-Django 中获取前几个月
- druid - Druid GroupBy 查询在更改字段顺序时给出不同的响应
- r - 在 R 或 Minitab PLS 回归菜单中使用 plsr() 函数时的不同 PLS 模型