4

私は Flex と Bison の初心者であり、Flex 字句スキャナーを作成してから Bison 文法を作成しようとしましたが、次の問題が発生しました。

  • 単語は、Flex 定義の異なる定義と一致する場合があります。私は、Bison がその文法から適切な Flex 定義を見つけて選択できるようにしたいと考えています。

たとえば、単語abcがFlex でcategory1orとして表示される場合、Bison 文法のように構文エラーがなく、category2 として正しく表示されないかどうかcategory2を Bison に選択してもらいたいと思います。しかし、それが であり、 ではなく構文エラーとして表示される場合、Flex はそれを として分類する必要があります。category1category1category1category2category2

これを行う方法はありますか?それとも、Flex と Bison を完全に誤解していますか?

4

3 に答える 3

2

この状況は通常、「半予約」語と呼ばれることが多いもの、または C# で「コンテキスト キーワード」と呼ばれるもので発生します。bison/flex では、これらは扱いが面倒です。(Lemon には、ディレクティブを使用してトークンのフォールバックを定義できる文書化されていない機能があり%fallback、これはこのユース ケースに最適ですIDENTIFIER。文脈上予約されたトークンのフォールバックを作成するだけです。)

いくつかの作業を行うと、次のような非端末を定義することで同じ効果を達成できる場合があります。

identifier : IDENTIFIER | VAR | ADD | REMOVE | DYNAMIC | GLOBAL | ...
/* VAR is special in a local-variable-type: */
local_variable_type_identifier : IDENTIFIER | ADD | REMOVE | DYNAMIC | GLOBAL | ...

全体を通して使用してから、競合に参加する半予約語を除外する制限された非終端記号に置き換えることによるidentifier削減を含む各競合を解決することで、おそらくカスタマイズする必要がある場所を見つけることができます。identifier

それは素晴らしいことではありませんが、私が知っている最良のアプローチです。

于 2013-01-12T19:37:18.397 に答える
0

Flex は「開始状態」と「排他的開始状態」をサポートしており、これにより必要な効果を得ることができます。abcコンテキストが であるべきものであることが事前にわかっている場合はcategory1、 Flex に として分類される状態を開始しabccategory1他の状態では に分類されるように指示できますcategory2。特別な状態が終わったら、状態を元に戻すことを忘れないでください。この種の手法を使用して、選択したキーワードを一部のコンテキストではキーワードにし、別のコンテキストではそれを識別子として残すことができます。ただし、通常、字句アナライザーに常に同じ方法で (たとえば token としてKW_ABC) 分類させ、そのトークンを使用して文法を進めます。

于 2013-01-12T21:22:04.913 に答える
-1

1 月 13 日 19:39 の Jonathan Leffler の上記のコメントを繰り返しますが、コンテキストに依存しないパーサー ジェネレーター ツールを使用して、コンテキストに依存する言語を解析しようとしています。文法を再考するか、パーサー生成ツールの選択を再考する必要があります。あなたがしていることは、ドライバーを使って釘を打ち込もうとするのと同じです。

私だったら、本やインターウェブに戻って、文脈依存の文法解析の処理を確認します。

于 2013-11-10T20:08:33.823 に答える