私はここ数週間、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コードでこの整数にアクセスできますが、上記の移動の構文はわかりませんdescrs : {for (int i=0;i<n;++i){descr}}
(おそらくばかげているように見えることはわかっています)
これに失敗した場合、この問題を回避する他の方法はありますか?
任意の入力をいただければ幸いです。前もって感謝します。