GNU bison 和 yacc 有什么区别?

What is the difference between GNU bison and yacc?

我正在编写一个解析器,我希望它尽可能具有可移植性。

现在我正在使用 GNU bison 来生成我的解析器,但我不确定我的代码是否依赖于 yacc 扩展不完全便携。

所以我想知道 GNU bison 的特性,原来的 yacc 丢失了。

我担心的原因是因为我注意到我的解析器无法在 Windows 上使用 bison 端口进行编译。我会牺牲 GNU bison 特性并坚持使用最初的标准化 yacc 如果它能让我的解析器更容易在不同平台之间移植。

那么GNU bison和原来的标准yacc有什么区别呢?如果我希望我的程序尽可能具有可移植性,那么在使用 GNU bison 时应该避免哪些特性?

通常分发 bison 生成的解析器的方式是分发生成的解析器。这意味着 bison 和 yacc 甚至都不需要安装在目标机器上,并且允许您自由选择您喜欢的 bison 版本并使用它的功能。 (当然,bison 输入文件也将包含在分发版中;包括 bison 输出文件只是意味着 bison 不需要 运行 编译代码。)

如果您想验证您的解析器描述是否与 yacc 兼容,您可以在生成解析器时尝试使用 --yacc 标志。这将使 bison 尝试模仿 yacc,尽管它不会阻止您请求明显超出 yacc 范围的功能,例如 %glr-parser 或 Java/C++ 输出。但坦率地说,我认为第一段中概述的策略会让你过得更好。

如果您想获得 yacc 中没有的 bison 功能列表,您可以从在 bison manual. Or you could read the Posix yacc documentation.

中搜索单词 yacc 开始