1

私は bison を初めて使用します。いくつかの基本的な質問があります。

  1. 次のうち、正しいのはどれか。

    %left ’*’ ’/’
    

    また

    %left '*' '/'
    

    つまり、トークンを取得する代わりに、それを使用してパーサー ファイルで定義します。

  2. 次のようなルールを定義できますか。

    EXP -> EXP "and" EXP 
    

    それ以外の

    EXP -> EXP AND EXP //AND here is a token
    
  3. パーサーを構築するための LEX ファイルと BISON ファイルがある場合、どちらをインクルードする必要がありますか? また、共通のヘッダー ファイルを使用した場合、どちらのファイルを定義する必要がありますか?

  4. BISON アルゴリズムがルールの 1 つに従って一致を検出した場合、最初に reduce を作成し、次に一致したルールに対して定義されたアクションを実行しますか、それとも最初にアクションを実行してからスタックに reduce を作成しますか?

4

2 に答える 2

2
  1. フォーマットが原因で何を求めているのかを判断するのは難しいですが、答えはノーだと思います。 %leftトークンを定義するだけで(まったく同じよう%tokenに)、さらにそのトークンの優先順位レベルを設定します。レクサーでトークンを認識し、適切なトークン値を返すことによって、トークンを「取得」する必要があります。

  2. を使用することはできますが"and"、正しく行うことはほとんど不可能であるため、使用したくありません。ANDまたはand(引用符なし)を使用する方がはるかに優れています。違いは、引用符を使用する#defineと、.tab.hファイルにとして出力されないトークンが作成されるため、レクサーでそのトークンを生成する簡単な方法がないことです。

  3. それを行うにはいくつかの方法があります。最も簡単なのは、どちらももう一方を含めず、lexファイルにbisonの-dフラグによって生成されたヘッダーを含めることです。これはほとんどの例で行われていることです。lex.yy.cファイルの3番目のセクションにファイルを直接含めることも、.yファイル.tab.cの上部のセクションにファイルを含めることもでき.lます(両方ではありません!)。この場合、1つのファイルのみをコンパイルします。

  4. 最初にルールのアクションを実行し(アクションの実行中にRHSの項目の値を使用できるようにします)、次にスタックの削減を行い、RHS項目をactionputintの値に置き換えます$$

于 2012-12-09T20:05:47.900 に答える
1

私はポイント2でクリスにやや同意しません。"and"エラーメッセージでパーサーがユーザーにとって意味のないことではなく、それについてのことを報告するので、使用"and"する方が良いでしょう。TOK_ANDt_AND

そして、それを正しく理解するのはそれほど難しいことではありません:あなたが挿入した場合

%token TOK_AND "and"

どこかで、"and"またはTOK_AND文法ファイルで使用できます。しかし、私見、前者ははるかに明確です。

于 2012-12-10T08:02:37.140 に答える