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
我想告诉规则的顺序并不为IGNOREHIDDENFILES
和FOLLOWSYMLINKS
答
只是从我的头顶重要 - 创建一个子规则,并将其用于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 ;
谢谢!这解决了问题 – Flukey
欢迎您! – cantSleepNow
只需要注意一点:您可以在输入中重复IGNOREHIDDENFILES或FOLLOWSYMLINKS子句,而不会出现任何解析错误。也许你会想要检查这个听众或访客... –