2

次の形式の入力ファイルがある場合:

BEGIN
  stuff....
END

BEGIN
  stuff ...
END

私の.yファイルは次の形式です

%token BEGIN
%token END
%start begin

begin:  BEGIN stuff END

私がやりたいことは、yyparse を繰り返し呼び出して、単一の BEGIN/END を eof まで解析することです。

yyparse レポートへの最初の呼び出し:

syntax error, unexpected BEGIN, expecting $end.

これは理にかなっています。bison はファイル全体を解析したいと考えています。$end の定義で bison をより柔軟にする方法はありますか?

4

2 に答える 2

4

最も簡単な方法は、(ペアの) プロダクションを .y ファイルの先頭に追加することです。

input: begin | input begin;

これで yyparse は複数の入力を解析します。本当に yyparse を複数回呼び出す必要がある場合は、代わりに次のようにすることができます。

begin: BEGIN stuff END { YYACCEPT; } ;

YYACCEPT(必要な内部クリーンアップを行った後) yyparse がすぐに 0 を返すようにする特別なビルトインです。beginこれは、バイソンがデフォルトの削減 (先読みなし) で削減された場合にのみ機能するため、「おそらく」と言います。これが唯一のルールでbeginあり、beginそれを認識するために先読みが必要なコンテキストで使用されない場合に当てはまります。

于 2012-07-19T17:41:03.280 に答える
1

これをあなたの文法に追加してください:

all_begins: begins
          ;

begins: begins begin
      | begin
      ;

%start を次のように置き換えます。

%start all_begins

yyparse() を 1 回呼び出すだけです。

于 2012-07-19T17:40:29.213 に答える