2016-09-07 3 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> 

INTOとINTOを一致させる前に、COPYTABLEとblahが正常に一致しました。

誰かがこれがなぜ起こっているのかも説明できますか?

答えて

0

まあ、自分の質問を1分間見つめた後、私はそれを理解しました。 これはあいまいなレックス規則と関係がある。 'INTO'はINTO_WORDとIDの両方と一致させることができます。 IDはレクサールールの最上位にあるため、最初に一致します。