2016-04-27 33 views
1

我有這樣的規則:Antlr4 - 條款的訂貨

query 
    : SELECT selectAttribute (',' selectAttribute)* 
     FROM from 
     (WHERE where=booleanExpression)? 
     (ORDER BY sortItem (',' sortItem)*)? 
     (LIMIT limit=(INTEGER_VALUE | ALL))? 
     (IGNOREHIDDENFILES ignoreHiddenFiles=booleanValue)? 
     (FOLLOWSYMLINKS followSymlinks=booleanValue)? 
     SEMICOLON 
    ; 

這是有效的;

SELECT name FROM /tmp 
IGNOREHIDDENFILES true 
FOLLOWSYMLINKS true 

然而,這是無效的:

SELECT name FROM /tmp 
FOLLOWSYMLINKS true 
IGNOREHIDDENFILES true 

我想告訴規則的順序並不爲IGNOREHIDDENFILESFOLLOWSYMLINKS

回答

2

只是從我的頭頂重要 - 創建一個子規則,並將其用於query中的*。

編輯@NiloPaim在評論中指出後,我所做的改變不使用* wildcard.Something這樣的:

query: query_first SEMICOLON 
    | query_first ignoreHiddenFilesPart (followSymlinksPArt)? SEMICOLON 
    | query_first followSymlinksPArt (ignoreHiddenFilesPart)? SEMICOLON 
    ; 
query_first : SELECT selectAttribute (',' selectAttribute)* 
     FROM from 
     (WHERE where=booleanExpression)? 
     (ORDER BY sortItem (',' sortItem)*)? 
     (LIMIT limit=(INTEGER_VALUE | ALL))? 
      ; 
ignoreHiddenFilesPart: IGNOREHIDDENFILES ignoreHiddenFiles=booleanValue ; 
followSymlinksPArt: FOLLOWSYMLINKS followSymlinks=booleanValue ; 
+0

謝謝!這解決了問題 – Flukey

+0

歡迎您! – cantSleepNow

+1

只需要注意一點:您可以在輸入中重複IGNOREHIDDENFILES或FOLLOWSYMLINKS子句,而不會出現任何解析錯誤。也許你會想要檢查這個聽衆或訪客... –