2016-11-16 89 views
1

我正在嘗試編寫一個解析SQL where子句表達式的語法,並且面臨用詞法規則識別唯一標識符的問題。 我的語法是喜歡 -通過ANTLR解析GUID時出錯

grammar Sample; 
UID: '^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$'; 
literal_value : 
      UID 
      ; 

而我的代碼來解析是 -

public void compile() { 
    String expression = "4B66049D-6E1A-4CE6-8FBF-B31CD8B9E6AF" 
    ANTLRInputStream input = new ANTLRInputStream(expression); 
    SampleLexer lexer = new SampleLexer(input); 
    final CommonTokenStream tokens = new CommonTokenStream(lexer); 
    SampleParser parser = new SampleParser(tokens); 
    SampleParser.Literal_valueContext context = parser.literal_value(); 
    System.out.println(context.toStringTree()); 
} 

但我得到的錯誤 - 異常解析表達式:1號線4「‘:’令牌識別錯誤的」 ,位置0

回答

0

你給ANTLR一個正則表達式。但ANTLR不是一個正則表達式引擎。您需要按照它的語法,其中一些在這裏描述:https://github.com/antlr/antlr4/blob/master/doc/grammars.md

對於初學者來說,你不希望在開始和結束^$。那些是正則表達式的東西,而不是ANTLR的東西。

0

錨點^$在ANTLR中無效。此外,ANTLR不支持{...}

你想要做的是這樣的:

grammar Sample; 

literal_value 
: UID EOF 
; 

UID 
: BLOCK BLOCK '-' BLOCK '-' BLOCK '-' BLOCK '-' BLOCK BLOCK BLOCK 
; 

fragment BLOCK 
: [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9] 
; 

EOF是一個內置的令牌類型,這並不奇怪,表示文件($錨)結束。而關鍵字fragment表示這樣的規則永遠不會用於創建真實的令牌,它只能被其他規則使用。另見:What does "fragment" mean in ANTLR?