几周以来,我一直在用 flex 和 bison 编写一个解析器,但由于双重递归而停了下来,前几条规则的定义是相似的。Bison 总是在某个特定阶段选择错误的路径并崩溃,因为语法不合适。野牛代码看起来有点像这样:
set :
TOKEN_ /* token */
QString
QString
Integer /* number of descrs (see below) */
M_op /*'M' optional*/
alts;
和
alts :
alt | alts alt ;
alt :
QString
pName_op /* empty | TOKEN1 QString */
deVal_op /* empty | TOKEN2 Integer */
descrs
;
和
descrs :
descr | descrs descr ;
descr :
QString
QString_op /* optional qstring */
Integer
D_op /* optional 'D' */
Bison 停留在descrs
递归中,永远不会退出它进入下一个alt
。descr
然而,在初始块中读入的整数告诉我们将要出现多少个实例。所以我的问题是:
有没有办法为特定数量的递归实例准备野牛,以便他可以退出这个递归并进入“上面”的递归?我可以在 C 代码中访问这个整数,但我不知道所说移动的语法,比如 a descrs : {for (int i=0;i<n;++i){descr}}
(我知道这可能看起来很荒谬)
如果做不到这一点,有没有其他方法可以解决这个问题?
任何输入将不胜感激。提前致谢。