2013-10-09 3 views
0

Учитывая грамматику: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.

+0

Я прав, что вы хотите игнорировать двойной 'DOT' в вашем правиле lexer' WORD'? – Cv4

+0

Да. это на самом деле из моего другого вопроса: http: //stackoverflow.com/questions/19224181/antlr-lexer-exclude-a-certain-pattern Я формализовал коренную проблему на этот вопрос, надеясь сделать ее более ясной. – Wudong

ответ

0

Быстрое исправление - проверить предыдущий токен LA(-1), если он не равен . и добавить ведущий факультативный DOT.

Результирующая грамматика:

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

Веселитесь и наслаждайтесь ANTLR, это хороший инструмент.

+0

привет, можете ли вы уяснить это немного больше, например, как предикаты должны работать в ANTLR и почему грамматика в моем вопросе не работает? Семантические предикаты кажутся мощным инструментом, и я действительно хочу знать, что происходит внизу. Большое спасибо. – Wudong

+0

Проверьте API ANTLR, относящийся к используемой функции. Вы найдете его в разделе (http://www.antlr.org/api/Java/org/antlr/v4/runtime/IntStream.html#LA(int)). Там вы видите, что '-1' необходимо проверить против предыдущего символа, потому что подробно вы смотрите на« CharStream »(тип' _input' в lexer (http://www.antlr.org/api/ Java/org/antlr/v4/runtime/Lexer.html # _input)). Надеюсь, это поможет вам в решении вашей проблемы. – Cv4

Смежные вопросы