1

文法を考えると:

grammar Test;
words: (WORD|SPACE|DOT)+;
WORD : (
       LD
       |DOT       {_input.LA(1)!='.'}?
       ) +        ;
DOT: '.';
SPACE: ' ';
fragment LD: ~[.\n\r ];

Antlr4 で生成された Lexer を入力として使用すると、次のようになります。

test. test.test test..test

トークン シーケンスは次のようになります。

[@0,0:4='test.',<1>,1:0]
[@1,5:5=' ',<3>,1:5]
[@2,6:14='test.test',<1>,1:6]
[@3,15:15=' ',<3>,1:15]
[@4,16:19='test',<1>,1:16]
[@5,20:20='.',<2>,1:20]
[@6,21:25='.test',<1>,1:21]
[@7,26:25='<EOF>',<-1>,1:26]

テキストの最後の部分がandにtest..testトークン化される理由は何ですか?test ..testtest. .test

私をもっと困惑させたのは入力です:

test..test test. test.test

トークン シーケンスは次のとおりです。

[@0,0:3='test',<1>,1:0]
[@1,4:4='.',<2>,1:4]
[@2,5:9='.test',<1>,1:5]
[@3,10:10=' ',<3>,1:10]
[@4,11:14='test',<1>,1:11]
[@5,15:15='.',<1>,1:15]
[@6,16:16=' ',<3>,1:16]
[@7,17:20='test',<1>,1:17]
[@8,21:25='.test',<1>,1:21]
[@9,26:25='<EOF>',<-1>,1:26]

ここではtest.testが 2 つのトークンに分かれていますが、上記では 1 つです。_input.LA(1) の呼び出しには、これを引き起こす副作用がありますか? 誰か説明できますか?

私はAntlr4を使用しています。

4

1 に答える 1

1

クイックフィックスは、前のLA(-1)トークンが等しくないかどうかを確認し.、先頭にオプションの を追加することですDOT

結果の文法は次のとおりです。

grammar Test;
words: (WORD|SPACE|DOT)+;
WORD : DOT? (
       LD
       |{_input.LA(-1)!='.'}? DOT       
       ) +        ;
DOT: '.';
SPACE: ' ';
fragment LD: ~[.\n\r ];

ANTLRを楽しんで楽しんでください。これは素晴らしいツールです。

于 2013-10-10T09:29:19.420 に答える