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

Parsing 将Bison语法拆分为更小的语法文件,parsing,bison,yacc,Parsing,Bison,Yacc,我有一个野牛语法文件,有700行长,而且还在增长;我已经尽我所能地将它划分开来,但随着我的语言变得越来越复杂,管理和组织所有规则变得越来越困难。我试着寻找一些方法来做类似于野牛的#include之类的事情,这样我至少可以在文本上把它分开,但结果是干的。有没有一种方法可以让我不借助makefile黑客之类的工具而将语法分成更小的模块?Bison没有类似于C的\include的工具 imho说,向bison配方中添加预处理器步骤不是“makefile hack”,而是make的预期用例 对bison

我有一个野牛语法文件,有700行长,而且还在增长;我已经尽我所能地将它划分开来,但随着我的语言变得越来越复杂,管理和组织所有规则变得越来越困难。我试着寻找一些方法来做类似于野牛的
#include
之类的事情,这样我至少可以在文本上把它分开,但结果是干的。有没有一种方法可以让我不借助makefile黑客之类的工具而将语法分成更小的模块?

Bison没有类似于C的
\include
的工具

imho说,向bison配方中添加预处理器步骤不是“makefile hack”,而是
make
的预期用例


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

Bison没有类似于C的
#include
的功能

imho说,向bison配方中添加预处理器步骤不是“makefile hack”,而是
make
的预期用例


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

而不是拆分语法本身,您可以通过让规则体调用函数将其压缩为一行程序的序列:

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

语法导向翻译方案的细节在于这些函数,这些函数可以分为模块。

您可以通过让规则体调用函数,将语法本身压缩为一行程序的序列,而不是将语法本身拆分:

 foo : ID bar '{' whatever_list '}' { $$ = ast_node_foo($1, $2, $4); }
     ;
语法导向翻译方案的详细信息在这些函数中,这些函数可以分为模块。

是一种yacc变体,支持从多个文件中读取
%include

%include bar.y   /* inserts the contents of bar.y at this point */
虽然btyacc支持所有POSIX yacc,但它只支持几个bison扩展。

是一个yacc变体,支持从多个文件读取
%include

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

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

我希望我的交互式编译反馈能在vim中正常工作,但事情就是这样<代码>cat它是。谢谢说到Vim,Vim的折叠理解
.y
文件。您可以折叠语法文件的视图,使规则显示为折叠<代码>cat它是。谢谢说到Vim,Vim的折叠理解
.y
文件。您可以折叠语法文件的视图,使规则显示为folds.interest。关于btyacc和bison之间的差异,是否有任何文件?我想坚持使用基本上每个发行版都有软件包的东西,我不确定对
%include
的支持是否足以让我跳槽。关于btyacc和bison之间的差异,是否有任何文件?我想坚持使用基本上每个发行版都有软件包的东西,我不确定对
%include
的支持是否足以让我跳槽。生产中是否有一个软件主要使用它?@user1424739我怀疑,很多。例如,GCC使用的主要是节点构造操作。新的解析器是一个手工编写的递归下降任务,但仍然通过构建树来工作。任何一个非常简单的解析器,主要是为了展示如何最好地管理语法规则,但比GCC更简单?是否有一个生产软件主要使用它?@user1424739,我怀疑,很多。例如,GCC使用的主要是节点构造操作。新的解析器是一个手工编写的递归下降任务,但仍然通过构建树来工作。是否有一个非常简单的解析器主要用于展示如何最好地管理语法规则,但比GCC更简单?