1

Bison で現在のトークン スタック サイズを確認する方法はありますか?

別のルールのセマンティック値にアクセスするために、 nを負の数として$nを使用したいと思いますが、スタックが十分に大きい場合に限ります。

ありがとうございました。

4

1 に答える 1

0

次のようなルールがあるとします。

stmt:   ID '=' DIGIT
        { $$ = $3; }
    ;

生成されたコード フラグメントは次のとおりです。

{ (yyval) = (yyvsp[(3) - (3)]); }

したがってyyvsp、「配列」は答えの一部です。(通常 - GLR ではない) 生成コードをさらに上に行くと、これyyvspは実際には配列ではなくポインターであることがわかります。例えば:

yyvsp = yyvs + yysize - 1;

あなたが望む値のようyysizeです。残念ながら、これはユーザー アクションが実行される前に終了したブロックにローカルな変数であるため、直接使用することはできません。ただし、次のコードを見つけることもできます。

yyvsp = yyvs;

コードを見ると、これyyvsはスタックのベース (動的に割り当てることができる) へyyvspのポインターであり、スタックの途中までのポインターのようです。これらの変数は両方ともyyparse()関数全体で表示されます (したがって、特に、ユーザー アクション内で表示されます。必要な答えは次のとおりです。

int nrules = yyvsp - yyvs;

このようにソースコードを突っ込むのは少しきれいではありませんが、答えは得られます。

GLR 文法を使用する場合、Bison GLR 文法に同じ意味を持つ同じ変数があるかどうかを調べる必要があります。そうではないかもしれません。

于 2010-01-15T03:16:52.227 に答える