Antlr4 - 条款的订货

问题描述:

我有这样的规则: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

只是从我的头顶重要 - 创建一个子规则,并将其用于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子句,而不会出现任何解析错误。也许你会想要检查这个听众或访客... –