0

私の bison からの「.output」ファイルには、$@1、$@2、...、$@38 などの名前の変数が多数含まれています。これらはどういうわけか、私が調査している文法に多く含まれる中間アクション規則に関連していますが、ある意味ではまだ完全には識別できていません。これらは非終端記号を表しており、何らかの形でアクションの途中の規則に関連しています。それが私が言えるすべてです。

編集:


input.y (漫画版):

%start  statement

%%

statement:  /* empty */ { print("testA"); }
    |   ';'         { print("testB"); }
    |       statement   { print("testC"); } thing1 thing2 { print("testD"); }
    ;

input.output (漫画版):

0 $accept: statement $end

1 statement: /* empty */
2      | ';'

3 $@1: /* empty */

4 statement: statement $@1 thing1 thing2

10 thing1: /*empty*/
20 thing2: /*empty*/
4

2 に答える 2

2

ルールに中間ルールアクションを配置することは、アクションのセマンティック値の番号付けを除いて、右側が空で同じアクション(現在は最終アクション)を持つ非終端記号を追加することとほぼ同じです。 。(bisonを使用すると、生成を開始する前に負のインデックスを使用してセマンティック値を参照できます。これは、bisonがスタックオフセットを計算することを除いて、ルールの途中のアクションに使用されるメカニズムです。)

挿入された空の非終端記号は「名前付き」@1, @2, ...です。これらは州の説明に表示されます。ルールの途中のすべてのアクションがプレースホルダーに置き換えられたように見えます@i(実際に起こったことです)。

編集

ルールの途中のアクションには、$@nまたはという名前が付けられている可能性があります@nreader.c527行目(私が書いている最新のリリースであるv2.6.5)の有益なコメントによると:

  /* If the midrule's $$ is set or its $n is used, remove the `$' from the
     symbol name so that it's a user-defined symbol so that the default
     %destructor and %printer apply.  */

言い換えると、中間ルールのアクションは$、値がない場合(値を設定したり、誰も値を使用したりしない場合)、名前に正確にaが含まれます。それが値を持っている場合(そして私はほとんどいつもそうだと思います)、$その名前にはaが含まれていません。

謎は解けたと思います。

于 2012-12-04T06:14:10.517 に答える
1

Bison 2.3 までは、規則中アクションの無名記号は という名前@Nでしたが、Bison 2.4 で に変更されました$@Nhttp://lists.gnu.org/archive/html/bison-patches/2006-10/msg00075.htmlを参照してください。

要点: が表示@Nされた場合は、Bison のコピーを更新する時期です :)

于 2012-12-05T08:57:14.590 に答える