0

ラムダ計算を解析するために、LL1 パーサー ジェネレーターであるTinyPGを使用しています。(a b)関数の適用などを解析するルールを書こうとしてい(a b c)ます。

これまでのところ、次のルールがあります (少し単純化されています)。

APPLICATION -> LPARENTHESES VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;

しかし、それは、左括弧の後と右括弧の前にスペースがある用語を解析できません: ( a b ). 次のように、開始ブラケットの後にスペースを許可できます。

APPLICATION -> LPARENTHESES SPACE* VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;

しかし、閉じ括弧の前にスペースを許可するように設定するのに問題があります。私はこれを思いついたが、うまくいくようだ:

ARG_LIST        -> (RPARENTHESES | (SPACE+ (RPARENTHESES | (VARIABLE ARG_LIST))));
APPLICATION     -> LPARENTHESES SPACE* VARIABLE ARG_LIST;

しかし、面倒で再帰的であるため、ノードの読み取りとコンパイルが難しくなります。これを解析するための非再帰的または少なくともより簡単な方法はありますか?

4

1 に答える 1

1

パーサーを空白と混同する理由はありません。[Skip]チュートリアルに示されているように、属性を使用してスキャナーで無視するだけで十分です。

[Skip] WHITESPACE -> @"\s+";

「スキップ」は「削除」ではありません。これは、スキャナがトークンを認識してから無視する必要があることを意味します。空白をスキップしても、空白は英数字のトークンをうまく区切ることができます。文法にスペーストークンを含める必要がないだけで、次のようになります。

APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES;

(実際には、空のアプリケーション リストは通常​​許可されているため、 a*ではなくa で記述し+ます。しかし、それはあなたの言語です。)

于 2015-05-13T02:19:15.617 に答える