1

私は以下を持っています

rule : A B;

A : 'a_e' | 'a';
B : '_b';

入力:

a_b    //dont work
a_e_b  //works

レクサーがこれとのマッチングに問題があるのはなぜですか?ANTLRが「a_b」の「a_」と一致する場合、バックトラックするか、先読みなどを使用して、トークンAと一致しないことを確認してから、トークンAを「a」と一致させてから、トークンBを「_b」と一致させる必要がありますか?

私は、antlrがどのように機能するかについて非常に基本的なことを誤解していると思います。私はANTLRドキュメントとグーグルでそれを読んでみました。しかし、レクサーとパーサーを使った経験はほとんどありません。

助けてくれてありがとう。

4

1 に答える 1

1

'a'、'_'、'e'、および'b'を区別するには、構文述語を使用する必要があります。

以下が機能します。

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;

これにより、「a_e_b」と「a_b」が期待どおりに解析されます。

The DefinitiveANTLRReferenceの第13章を確認することをお勧めします。

于 2011-12-09T18:17:45.027 に答える