【问题标题】:Why does the Bison always output a greater-than symbol? How to omit it?为什么 Bison 总是输出大于号?如何省略它?
【发布时间】:2021-09-04 13:45:19
【问题描述】:

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

> 

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

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

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

【问题讨论】:

  • '产生大于符号的原因是什么?'你的代码中有一些东西。 '我认为我的“主”函数中没有任何东西告诉 Bison 输出大于符号'确实没有。

标签: bison flex-lexer yacc lex


【解决方案1】:

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

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

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

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

【讨论】:

  • 你好@rici 是的,我正在使用 Flex。我的输入不包含 > 符号(我正在将非 XML 文件转换为 XML)。根据您的建议,我添加了 %option nodefault 但我的输出继续以换行符结尾 >.
  • @roger: 好的,那么你必须调试你的解析器:-)。调试跟踪将很有用。试图在没有任何支持文档的情况下解决水晶球问题并不容易。可悲的是,我的透视能力有限。
  • 嗨@rici 好的,我会进一步调查。谢谢。
  • 你好@rici 只是想让你知道,我找到了罪魁祸首。下面是启动规则的操作: { printf("%s\n> ", $5);注意 \n 后面的大于号 ...哎呀!
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多