使用yacc/bison编写语法文件的时候,经常遇到的一个问题就是在
一个语法文件中包含了太多规则,以至于文
件的尺寸变得异常庞大,显得很难看。一个普通语言的语法文件,加上语义动作和相关处理函数,尺寸在 5000
行以上并不是什么稀罕事,这在软件设计来说是一件让人难以忍受的事情。毕竟,面对这么大的一个文件,无论是
阅读还是维护,都不是一件让人舒心的体验。
以前在Cadence的时候,解决这个问题是通过 m4将一个大的语法文件分解为多个子文件来获得模块化组织的效
果。现在我也决定采用相同的方式来组织目前编写的这门语言的语法模块。
m4实际上是一个宏处理器,单纯从宏处理的功能上来看,m4与C语言的宏处理器提供的功能比较相似,包括条件
编译,宏定义,包含文件,等等。不过除了基本的宏处理功能以外,m4还提供了运行系统命令,文本处理,算术运
算等功能。相比于C语言的预处理器而言,m4无疑更为强大一些。
具体到我的应用场景中,在使用m4之前,我是将所有的语法规则放到一个 parser.y文件中,引入m4以后,我将
原先的 parser.y文件分解为若干个子文件,其中顶层文件的名称为 top_parser.m4y,其他子文件名称为
expr.m4y, statement.m4y,。。。
在 top_parser.m4y中通过m4提供的include命令将其他的子文件包含进来,从而达到将语法部分模块化组织
的目的。
这样作的一个潜在的好处是, 如果以后需要编写新语言的parser,并且新语言与已实现的语法在语法规则方
面具有共性的话,就可以将包括这部分共性的子文件复用到新语言的parser中,避免了重复开发的工作
量。这样的事情,以前在Cadence曾经有过体验。当时系统中已经存在了语言A的语法规则文件,后来因为客户要
求,需要开发B语言的parser,而A与B这两门语言的语法规则存在很多相似的地方,所以在开发B的parser的
过程中,我们通过m4复用了不少A的语法规则,大大提高了开发效率。
件的尺寸变得异常庞大,显得很难看。一个普通语言的语法文件,加上语义动作和相关处理函数,尺寸在 5000
行以上并不是什么稀罕事,这在软件设计来说是一件让人难以忍受的事情。毕竟,面对这么大的一个文件,无论是
阅读还是维护,都不是一件让人舒心的体验。
以前在Cadence的时候,解决这个问题是通过 m4将一个大的语法文件分解为多个子文件来获得模块化组织的效
果。现在我也决定采用相同的方式来组织目前编写的这门语言的语法模块。
m4实际上是一个宏处理器,单纯从宏处理的功能上来看,m4与C语言的宏处理器提供的功能比较相似,包括条件
编译,宏定义,包含文件,等等。不过除了基本的宏处理功能以外,m4还提供了运行系统命令,文本处理,算术运
算等功能。相比于C语言的预处理器而言,m4无疑更为强大一些。
具体到我的应用场景中,在使用m4之前,我是将所有的语法规则放到一个 parser.y文件中,引入m4以后,我将
原先的 parser.y文件分解为若干个子文件,其中顶层文件的名称为 top_parser.m4y,其他子文件名称为
expr.m4y, statement.m4y,。。。
在 top_parser.m4y中通过m4提供的include命令将其他的子文件包含进来,从而达到将语法部分模块化组织
的目的。
这样作的一个潜在的好处是, 如果以后需要编写新语言的parser,并且新语言与已实现的语法在语法规则方
面具有共性的话,就可以将包括这部分共性的子文件复用到新语言的parser中,避免了重复开发的工作
量。这样的事情,以前在Cadence曾经有过体验。当时系统中已经存在了语言A的语法规则文件,后来因为客户要
求,需要开发B语言的parser,而A与B这两门语言的语法规则存在很多相似的地方,所以在开发B的parser的
过程中,我们通过m4复用了不少A的语法规则,大大提高了开发效率。