1

GNU bisonを使用している間、プロダクションと一致した後に何もせず、他のルールを使用して同じトークンのシーケンスを減らすことができるかどうかを確認することは可能ですか?基本的に、私が探しているものはこれに似ています:

iexpr: VARIABLE { if (condition) {
                    /*some action */
                  }
                  else {
                    /*pushback read symbol, and check if other pattern can
                         be matched */
                  }
                }
 fexpr: VARIABLE {   }

ありがとう

4

2 に答える 2

1

これにはYYBACKUP機能を使用できるはずです。

于 2012-12-25T00:13:28.813 に答える
1

さて、あなたはbtyaccでこれを行うことができます-バックトラックを行うyaccバリアント:

iexpr: VARIABLE [ if (!condition)
                     /* this parse was wrong, backtrack and try something else */
                    YYERROR; ]
                { /* some action */ }
fexpr: VARIABLE { /* some other action */  }

しかし、コメント提供者が指摘しているように、パーサーでタイプチェックを実行しようとすることは悪い考えであり、不必要に複雑な文法と、タイプエラーに対する悪い混乱するエラーメッセージにつながるだけです。

代わりに、すべての型の式に対して単一の(セットの)exprルールを設定し、結果の解析ツリーに対して個別のパスで型チェックを実行します。解析ツリー全体を構築して、このために保持する必要はありません。解析ツリーの小さな断片を構築してすぐにタイプチェックし、さらに解析する前に不要な情報を破棄することができます。何かのようなもの:

expr: expr '+' expr {
    Typecheck('+', $1, $3); /* make sure operand types are appropriate for an add */
    $$ = BuildBinopCode('+', $1, $2); /* build some code to add two things */
}
于 2012-12-25T07:13:34.803 に答える