2016-09-07 2 views
0
grammar Simpletest; 
prog: test_statement* EOF ; 

test_statement 
    :COPY_TABLE ID INTO_WORD ID # copytable; 


ID 
    : (SIMPLE_LETTER) (SIMPLE_LETTER | '$' | '_' | '#' | ('0'..'9'))*; 

COPY_TABLE: 'COPY TABLE'; 

SIMPLE_LETTER 
    : 'a'..'z' 
    | 'A'..'Z' 
    ; 

INTO_WORD: 'INTO'; 

SPACES 
    : [ \t\n\r]+ -> skip 
    ; 
NEWLINE : [\r\n]+ ; 

Как вы можете видеть в приведенной выше тестовой грамматике, я бы ожидал, что он будет легко разбирать что-то вроде «COPY TABLE blah INTO blah2». Однако результат удивителен.Antlr4 странное поведение синтаксического анализа

$ grun Simpletest prog -tokens -trace -diagnostics -tree 
COPY TABLE blah INTO blah2 
[@0,0:9='COPY TABLE',<2>,1:0] 
[@1,11:14='blah',<1>,1:11] 
[@2,16:19='INTO',<1>,1:16] 
[@3,21:25='blah2',<1>,1:21] 
[@4,27:26='<EOF>',<-1>,2:0] 
enter prog, LT(1)=COPY TABLE 
enter test_statement, LT(1)=COPY TABLE 
consume [@0,0:9='COPY TABLE',<2>,1:0] rule test_statement 
consume [@1,11:14='blah',<1>,1:11] rule test_statement 
line 1:16 missing 'INTO' at 'INTO' 
consume [@2,16:19='INTO',<1>,1:16] rule test_statement 
exit test_statement, LT(1)=blah2 
line 1:21 extraneous input 'blah2' expecting {<EOF>, 'COPY TABLE'} 
consume [@4,27:26='<EOF>',<-1>,2:0] rule prog 
exit prog, LT(1)=<EOF> 

Он соответствовал COPYTABLE и успешно удалялся, прежде чем не смог выполнить INTO с INTO !!

Может кто-нибудь объяснить, почему это может произойти?

ответ

0

Хорошо, посмотрев на мой вопрос в течение одной минуты, я понял это. Это связано с неоднозначными правилами lex. «INTO» можно сопоставить как с INTO_WORD, так и с ID. Поскольку ID находится в верхней части правил lexer, он совпадает с первым.

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