2016-11-21 7 views
0

私は、構文認識エディタのためにトークンを特定し、パーサのトークンを特定するための2つの方法で使用されるレクサーを定義するレクサー文法を持っています。最初のケースでは、レクサーはコメントと空白を返すべきですが、2番目のケースでは、コメントと空白は必要ありません。 2つの異なるレクサークラスが必要ですか?それぞれのレクサークラスは、それぞれ独自の文法バリエーションで定義されていますか?または、チャネルを使用して単一のレクサーでこれを達成できますか?どうやって?同じレクサーを使用してトークンストリームを空白の有無にかかわらず提供するにはどうすればよいですか?

2つの別々の文法が必要な場合は、コメントと空白以外のすべてのルールを除外し、その別の「共通」文法からそれらのルールをインポートすることができます。

答えて

1

通常、トークンチャネルを介して(トークンチャネルを介して)空白(ホワイトスペースなど)をフィルタリングします(または完全にスキップします)。これは文法の一部なので、あるユースケースでは空白を、もう一方のケースでは空白を必要とする場合は2文法が必要です。そして、はい、すべての共通ルールを持つ基本文法を、その違いだけを保持する特殊文法にインポートすることができます。ルールをオーバーライドすることもできます(たとえば、基本文法の空白ルールを定義し、メインの文法でそれを再定義することもできます)。

ただし、空白をフィルタリングしないと他のすべてのルールに影響が出ることに注意してください。その場合は、空白処理をどこのパーサールールにも明示的に追加する必要があります。例えば:

blah: a WS* or WS* b; 

blah: a or b; 

関連する問題