12

私はANTLRでパーサーを作成した経験があり、(自己教育のために:))そのうちの1つをPEG(Parsing Expression Grammar)に移植しようとしています。

私がそのアイデアを感じ取ろうとしているとき、私が何かを逃したと感じる程度に、1つのことが厄介だと思います。それは空白の扱い方です。

ANTLRでは、空白とコメントを処理する通常の方法は、トークンを非表示のチャネルに配置することでしたが、PEG文法では、トークン化の手順はありません。コメントがほとんどどこでも許可されるCやJavaなどの言語を考えると、コメントをすぐに「非表示」にしたいのですが、コメントには意味的な意味がある場合があるため(たとえば、コードド​​キュメント、クラス図などを生成する場合)、それらを破棄したいだけではありません。

それで、これに対処する方法はありますか?

4

2 に答える 2

10

個別のトークン化フェーズがないため、特定の文字 (またはトークン) を破棄する「時間」がありません。

ANTLR に精通しているので、次のように考えてください。ANTLR が PEG のみを処理するとします。したがって、パーサー ルールのみがあり、レクサー ルールはありません。では、たとえばスペースをどのように破棄しますか? (できません)。

したがって、あなたの質問への答えは次のとおりです。できません。PEGのスペースルールで文法を散らかさなければなりません。

ANTLR

add_expr
 : Num Add Num
 ;

Add   : '+';
Num   : '0'..'9'+;
Space : ' '+ {skip();};

ペグ

add_expr
 : num _ '+' _ num
 ;

num : '0'..'9'+;
_   : ' '*;
于 2012-04-13T11:13:34.543 に答える
2

PEG パーサーをネストすることができます。アイデアは、最初のパーサーが文字を消費し、トークンを 2 番目のパーサーに供給するというものです。2 番目の PEG パーサーはトークンを消費し、実際の作業を行います。

もちろん、これは、他の構文解析スキームと比較した構文解析式文法の利点の 1 つを放棄することを意味します。それは、PEG の単純さです。

于 2012-05-05T17:08:30.553 に答える