我有这个规则:
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 在评论中指出后,我进行了更改,不使用 * 通配符。类似于:
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 ;
关于java - Antlr4 - 子句的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890878/