2

私は、 lemon parser generatorを使用して構築されたSQL 文法を持っています。コマンドを解析するための通常のエントリ ポイントはステートメント (のような) であるため、このステートメントは文法の非終端記号です。これまでのところ、すべて正常に動作しています。SELECT ...%start

ここで、「部分的な解析」を行いたいと考えています。たとえば、式またはWHERE句のみを解析します。基本的にこれは%start、実行時に非端末を変更することを意味します。私はドキュメントでそれについて何も見つけることができませんでした。これはレモンで可能ですか?

そうでない場合は、カスタムの開始点で解析を失敗させるようなことを考えていました。これはかなりハックのように感じます。よりクリーンな方法はありますか?

4

1 に答える 1

2

標準の LALR パーサー ジェネレーター (LEMON など) では、やりたいことができません (実際にはできません)。

これを機能させるには、目的の非終端記号 (SELECT_clause、WHERE_clause など) を受け入れる開始状態を作成する必要があります。これを行うには、文法を次のように効果的に変更します。

   GOAL = TOP ;
   RULEn = ... ;
   SG = .... ;

ここで、SG は 2 番目の目標 (例: WHERE 句) です。

   GOAL = TOP | SG ;
   RULEn = ... ;
   SG = ... ;

これを行った場合の悪いニュースは、通常、LALR 状態の生成に許容される条件に違反し (たとえば、先読みセットがリダクションを区別しなくなる)、パーサー ジェネレーターが機能しなくなることです。

これは、コンテキストフリーの文法を処理できる GLR パーサー ジェネレーターを使用すると、はるかに簡単になります。(実際、DMS Software Reengineering Toolkit の非終端記号に関して定義されたパターンに対して、これを正確に行います。実際には、少しやり過ぎて、すべての非終端記号をゴール生成に入れます。これはクレイジーに聞こえますが、認識できるようになります言語から整形式の (非終端記号) 句)。

于 2013-03-17T20:54:47.997 に答える