2012-03-22 8 views
1

私はANTLRで初心者を静かにしています。残念ながら、任意の成功なしで...ANTLR 3解析 - 不一致文字...期待している

私は(トークンタグが実際の例で使用されている)問題を記述するために、私の文法を簡素化:


grammar Test; 

WORD : ('a'..'z')+; 

DOT : '.'; 

TAG : '.test'; 

WHITE_SPACE 
    : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;}; 


rule 
    : 'a' DOT WORD 'z'; 

私は言葉「.bcd Zを解析しようとすると、 「すべてがうまくあるが、私は言葉をしようとすると、 『.tbyfa zは』それが問題である私の意見では私にエラー

line 1:4 mismatched character 'b' expecting 'e' 
line 1:5 missing DOT at 'yfa'

を示し、その文字列の後に」。」トークン ".test"ともなる "t"で始まります。私はバックトラック=真実を試みたが、成功もなかった。


この問題を解決するにはどうすればよいですか?
ありがとうございます。

+0

これは自分自身の文法です – user1286372

+0

はい、それは演算子です。 – user1286372

+0

".test"はキーワードです。 ".test"内のドットはDOTトークンとは異なる意味を持ちます。 – user1286372

答えて

2

この場合、ANTLRのレクサーは代替案に戻すことができません。レクサー".t"と表示されたら、TAGトークンと一致するように試みますが、これは成功しません。したがって、レクサーは".t"で始まるものと一致するように試みますが、そのようなトークンはありません。そして、レクサーはではないは、DOTに一致するようにもう一度文字をバックトラックします。それが間違っているのです。それに対する可能な解決策はこのようにそれを行うことであろう

grammar Test; 

rule : 'a' DOT WORD 'z'; 
WORD : ('a'..'z')+; 
DOT : '.' (('test')=> 'test' {$type=TAG;})?; 
SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;}; 

fragment TAG : /* empty rule: only used to change the 'type' */; 

('test')=>は本当に"test"先があるかどうかを確認するために先読みするレクサーを強制的統語的述語です。これが当てはまる場合は、"test"が一致し、トークンのタイプがTAGに変更されます。また、'test'はオプションであるため、ルールはいつでもDOTトークンのみに戻ることができます。

+0

ありがとう! – user1286372

+0

私はもう別の質問があります。どのようにすれば、 ".test"や ".test2"のような形で ".xyz"という形でより多くのトークンを処理できますか? DOT: '。' ( 'test2')=> 'test2' {$ type = TAG2;} |( 'test')=> 'テスト' {$ type = TAG1;})?... ... – user1286372

+0

パーサーでTAG1とTAG2をトークンとして使用すると、問題が発生します(フラグメントなしのTAG1とTAG2)。これを修正する方法はありますか? – user1286372

関連する問題