野牛是否允许多个输入文件?

Does bison allow multiple input files?

我正在学习和练习野牛。目前我将所有语法放在一个 .y 文件中。

然而,随着语法的增长,它变得难以阅读。

所以我想知道我是否可以将它们分成不同的文件....

我已经搜索了 bision 手册,但没有找到任何东西..

Bison 没有此功能,尽管其他一些 yacc 衍生产品有。

不幸的是,上下文无关文法不能以任何有意义的方式组合;需要处理整个语法以构建解析表。所以有必要构建一个完整的语法文件,如果只是作为一个临时文件的话;类似于 C 预处理器的 #include 指令的机制将是必要的。 (添加对条件的支持有时也会很方便。)

一个处理 C 预处理器的一小部分的头脑简单的预处理器很容易编写(有些人甚至为此目的使用 sed,尽管那不是我的第一选择),或者你可以使用像 m4 这样的标准宏处理器(bison 依赖于它,所以你必须安装它)。向 Makefile 添加预处理步骤很简单,因此构建过程仍然可以自动化。但是有一个很大的缺点:预处理文件中的行号与原始源代码中的行号没有关系,因此需要保留预处理文件以进行调试(甚至有时为了了解编译器警告和错误)。

与上述无关,保持语法文件简短的一种方法是避免使用冗长的操作。在可能的范围内,缩减操作应保留在单个函数调用中。 (例如,这是编写产生 AST 的语法的一种自然方式。)此外,动作函数本身应该放在不同的 C 源文件(甚至多个 C 源文件)中,这样它们就不会弄乱语法文件。

一些实现折叠的代码编辑器确实知道如何折叠语法文件,尽管默认情况下很少启用该功能。这也可以使语法更易于阅读。