2016-04-27 1 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 

Я хочу сказать, правило о том, что порядок не имеет значения для IGNOREHIDDENFILES и FOLLOWSYMLINKS

ответ

2

Просто из верхней части моей головы - создайте subrule и используйте его с * в query.

EDIT После @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 на своем входе без ошибок синтаксического анализа. Может быть, вы захотите проверить это на слушателя или посетителя ... –