将 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 扩展。
我有一个 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 扩展。