首页 > 解决方案 > 为什么 Bison 总是输出大于号?如何省略它?

问题描述

我创建了一个 Bison 解析器来将输入数据转换为 XML。每当我运行解析器时,输出都会包含 XML,并且 XML 之后是这个符号:

> 

哎呀!该大于号使 XML 格式不正确。

是什么产生了大于符号?我如何告诉 Bison 不要生成它?我认为我的“主要”函数中没有任何内容可以告诉 Bison 输出大于符号:

int main(int argc, char *argv[])
{  
    yyin = fopen(argv[1], "r");
    
    yyparse();
    
    fclose(yyin);
    
    return 0;
}

标签: bisonflex-lexeryacclex

解决方案


猜测一下,您正在使用 (f)lex 并且您的词法分析器模式都不匹配>,因此使用默认操作。(f)lex 默认操作是在 上打印不匹配的字符yyout,这通常是不可取的。

我建议始终%option nodefault在您的 flex 文件中使用。如果有任何事情可能触发默认规则(并将默认规则更改为致命错误),这将导致 flex 发出警告。不幸的是,它实际上并没有告诉您哪些字符无法匹配,但是您应该能够通过查看规则来弄清楚这一点。

一个好的调试技术是编译带有调试跟踪的扫描仪版本,然后编写一个简单的包装器,它只是yylex在循环中调用直到它返回 0。(打印出返回的标记是更多的工作,但也很有用。)使用测试输入运行它,直到您对扫描仪按预期工作感到满意为止。

Bison 也有一个跟踪工具,在野牛手册的“调试你的解析器”一章中有描述。它还可以帮助您调试扫描仪问题,但您必须经历更多的调试日志记录。


推荐阅读