Учитывая грамматику:Antlr лексер семантический предикат на альтернативной
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]
Какие загадки почему последний фрагмент текста test..test
обозначен как test
.
и .test
, в то время как я должен был увидеть test.
.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
разделяется на два в то время как над ним одно. Является ли вызывающим _input.LA (1) некоторый побочный эффект, чтобы вызвать это? Может кто-нибудь объяснить?
Я использую Antlr4.
Я прав, что вы хотите игнорировать двойной 'DOT' в вашем правиле lexer' WORD'? – Cv4
Да. это на самом деле из моего другого вопроса: http: //stackoverflow.com/questions/19224181/antlr-lexer-exclude-a-certain-pattern Я формализовал коренную проблему на этот вопрос, надеясь сделать ее более ясной. – Wudong