9

この文法の違いは何ですか:

...
if_statement : 'if' condition 'then' statement 'else' statement 'end_if';
... 

この:

...
if_statement : IF condition THEN statement ELSE statement END_IF;
...

IF : 'if';
THEN: 'then';
ELSE: 'else';
END_IF: 'end_if';
....

違いがある場合、これはパフォーマンスに影響を与えるため...ありがとう

4

4 に答える 4

9

Will の回答に加えて、(レクサー文法で) レクサー トークンを明示的に定義することをお勧めします。パーサー文法でそれらを混合している場合、トークンがレクサーによってトークン化される順序が常に明確であるとは限りません。それらを明示的に定義する場合、それらは常にレクサー文法に配置された順序で (上から下へ) トークン化されます。

于 2010-03-23T07:37:04.420 に答える
2

最大の違いは、あなたにとって重要ではないかもしれないものです。レクサールールがレクサーにある場合は、継承を使用して、複数のレクサーが共通の字句ルールのセットを共有するようにすることができます。

パーサールールで文字列を使用するだけの場合、これを行うことはできません。レクサー文法を再利用する予定がない場合、この利点は重要ではありません。

さらに、私とほとんどのAntlrのベテランは、パーサー文法と混合するのではなく、実際のレクサー文法でレクサールールを見つけることに慣れているので、ルールをレクサーに入れることで読みやすさが向上すると主張できます。

どちらのアプローチでもAntlrパーサーが構築された後は、実行時のパフォーマンスへの影響はありません。

于 2010-03-24T19:43:42.853 に答える
1

唯一の違いは、最初の本番ルールでは、キーワードトークンが暗黙的に定義されていることです。暗黙的に定義されたトークンと明示的に定義されたトークンには、実行時のパフォーマンスへの影響はありません。

于 2010-03-23T07:29:37.727 に答える
0

さらに別の違い: lexer ルールを明示的に定義すると、指定した名前を介してそれらにアクセスできます (たとえば、特定のトークン タイプを確認する必要がある場合)。それ以外の場合、ANTLR は任意の番号 (プレフィックス付き) を使用します。

于 2015-09-21T09:12:44.970 に答える