我有一个长达700行并且不断增长的Bison语法文件;我试图尽可能地将其划分,但随着我的语言增加了更多的复杂性,管理和组织所有规则变得越来越难。我试着寻找一些方法去做野牛 - 等同于#include
之类的东西,这样我至少可以在文本上将它分开,但是干涸了。有没有办法让我将语法分成较小的模块,而不需要使用makefile hacks等?
答案 0 :(得分:2)
Bison没有类似于C #include
的设施。
在您的野牛配方中添加预处理器步骤不是“makefile hack”,imho,而是make
的预期用例。
在bison文件上使用cpp
有点棘手,因为他们倾向于在他们的序言中使用#define
指令,但还有其他预处理器。对于一个简单的案例,您可以使用cat
。
答案 1 :(得分:0)
不是分割语法本身,而是通过让规则体调用函数将其压缩为大多数单行序列:
foo : ID bar '{' whatever_list '}' { $$ = ast_node_foo($1, $2, $4); }
;
语法导向转换方案的细节依赖于这些函数,这些函数可以拆分为模块。
答案 2 :(得分:0)
btyacc是yacc变体,支持%include
从多个文件中读取
%include bar.y /* inserts the contents of bar.y at this point */
虽然btyacc支持所有POSIX yacc,但它只支持几个bison扩展。