为什么 Bison 总是输出大于号?怎么省略呢?
Why does the Bison always output a greater-than symbol? How to omit it?
我创建了一个 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,并且 none 的词法分析器模式与 >
匹配,因此使用默认操作。 (f)lex 默认操作是在 yyout
上打印不匹配的字符,这通常是不可取的。
我建议始终在您的 flex 文件中使用 %option nodefault
。如果有任何东西可以触发默认规则,这将导致 flex 发出警告(并将默认规则更改为致命错误)。不幸的是,它实际上并没有告诉您哪些字符不能匹配,但是您应该能够通过查看您的规则来弄清楚。
一个好的调试技术是编译一个带有调试跟踪的扫描器版本,然后编写一个简单的包装器,它只在循环中调用 yylex
直到它 returns 0。(打印出来返回的令牌需要更多工作,但也很有用。)运行 测试输入,直到您对扫描仪按预期工作感到满意为止。
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,并且 none 的词法分析器模式与 >
匹配,因此使用默认操作。 (f)lex 默认操作是在 yyout
上打印不匹配的字符,这通常是不可取的。
我建议始终在您的 flex 文件中使用 %option nodefault
。如果有任何东西可以触发默认规则,这将导致 flex 发出警告(并将默认规则更改为致命错误)。不幸的是,它实际上并没有告诉您哪些字符不能匹配,但是您应该能够通过查看您的规则来弄清楚。
一个好的调试技术是编译一个带有调试跟踪的扫描器版本,然后编写一个简单的包装器,它只在循环中调用 yylex
直到它 returns 0。(打印出来返回的令牌需要更多工作,但也很有用。)运行 测试输入,直到您对扫描仪按预期工作感到满意为止。
Bison 也有一个跟踪工具,在 bison 手册的“调试解析器”一章中有描述。它还可以帮助您调试扫描仪问题,但您必须费力处理更多的调试日志记录。