2016-07-24 12 views
0

Lexer Datei Code ist wie folgt:Parsing SQL CREATE TABLE-Anweisung ANTLR4 mit

lexer grammar CreateLexer; 

CREATE 
    : 'create' | 'CREATE' 
    ; 

NUMBER_OF_SHARDS:'number_of_shards' | 'NUMBER_OF_SHARDS'; 


NUMBER_OF_REPLICAS:'number_of_replicas' | 'NUMBER_OF_REPLICAS'; 


ID 
    : ('a' .. 'z' | 'A' .. 'Z' | '_' | '\u4e00' .. '\u9fa5' | '-')+ 
    ; 


INT 
    : [0-9]+ 
    ; 


NEWLINE 
    : '\r'? '\n' -> skip 
    ; 


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


INDEX 
    : 'index' | 'INDEX' 
    ; 

TABLE:'table'; 

und Parser Datei Code auch ist wie folgt:

parser grammar CreateParser; 

options 
    { tokenVocab = CreateLexer; } 
stat 
    : create_clause 
    ; 

create_clause 
    : CREATE INDEX index_name shards? replicas? 
    ; 

index_name 
    : (ID)*(INT)* 
    ; 

shards 
    : NUMBER_OF_SHARDS INT 
    ; 

replicas 
    : NUMBER_OF_REPLICAS INT 
    ; 

und dies ist mein Test Code zeigt, wie ich die obigen Module verwende:

String sql = "create index A number_of_shards 1 number_of_replicas 1"; 
CreateLexer createLexer = new CreateLexer(new ANTLRInputStream(sql)); 
createLexer.removeErrorListeners(); 

CreateParser parser = new CreateParser(new CommonTokenStream(createLexer)); 
ParseTree tree = parser.stat(); 
System.out.println(tree.toStringTree(parser)); 

, wenn ich den Test-Code oben laufen, bekam ich einen Fehler:

line 1:7 missing INDEX at 'index' 
(stat (create_clause create <missing INDEX> (index_name index A) (shards number_of_shards 1) (replicas number_of_replicas 1))) 

Nachdem ich 'INDEX' mit 'TABLE' at 'create_klausel' in paser Datei ersetzt und ersetzt 'index' mit ‚Tabelle 'im Testcode als:

Testcode:

String sql = "create table A number_of_shards 1 number_of_replicas 1"; 

paser Datei:

create_clause 
    : CREATE TABLE index_name shards? replicas? 
    ; 

und ich laufe es wieder, es immer noch die gleichen Fehler:

line 1:7 missing 'table' at 'table' 
(stat (create_clause create <missing 'table'> (index_name table A) (shards number_of_shards 1) (replicas number_of_replicas 1))) 

aber nachdem ich das Schlüsselwort TABLE in Parser Datei gelöscht wie folgt:

create_clause 
    : CREATE index_name shards? replicas? 
    ; 

seltsame Sache passiert, ich habe keinen Fehler:

(stat (create_clause create (index_name table A) (shards number_of_shards 1) (replicas number_of_replicas 1))) 

Kann mir jemand sagen, warum SQL Statement wie 'CREATE TABLE' nicht geparst werden kann? Vermisse ich etwas? Danke im Voraus!

Antwort

1

Antlr passt im Allgemeinen zu Lexerregeln, die zuerst auf der Textanpassungslänge basieren, dann auf der Reihenfolge in der Grammatik. So werden Ihre INDEX und TABLE Regeln nie übereinstimmen. Stattdessen wird der Text in ID Tokens gerendert.

Durch Entfernen der Anforderung für ein explizites Token INDEX haben Sie die Ursache des Fehlers entfernt.

Als allgemeine Regel, dump immer den Token-Stream, so dass Sie sehen können, was der Lexer tatsächlich macht.

+0

DANKE !! Das hat mein Problem wirklich gelöst !! Wie Sie gesagt haben, ich weiß, was mein Problem war – ldl