将 Bison 语法拆分为更小的语法文件

Splitting Bison grammars into smaller grammar files

我有一个 700 行长且还在增长的 Bison 语法文件;我已尽力将其划分,但随着我的语言变得越来越复杂,管理和组织所有规则变得越来越困难。我尝试寻找某种方法来做 #include 等的野牛等效项,这样我至少可以在文本上将其拆分,但结果很干。有没有办法让我将我的语法拆分成更小的模块,而无需诉诸 makefile hack 之类的东西?

Bison 没有类似于 C 的设施 #include

向您的野牛食谱添加预处理器步骤不是 "makefile hack",恕我直言,而是 make.

的预期用例

在 bison 文件上使用 cpp 有点棘手,因为它们倾向于在序言中使用 #define 指令,但还有其他预处理器。对于简单的情况,您可以只使用 cat.

您可以通过让规则主体调用函数将其主要压缩为一系列单行代码,而不是拆分语法本身:

 foo : ID bar '{' whatever_list '}' { $$ = ast_node_foo(, , ); }
     ;

句法导向翻译方案的细节在于这些功能,可以拆分成模块。

btyacc是yacc变种,支持%include读取多个文件

%include bar.y   /* inserts the contents of bar.y at this point */

虽然 btyacc 支持所有 POSIX yacc,但它只支持几个 bison 扩展。