Иногда при определении грамматики Xtext я определяю производственные правила без вводимого типа.
Например, при определении языка выражений круглые скобки могут использоваться для определения приоритета операторов, но не обязательно должны быть типом в метамодели.
Например, приведенная ниже грамматика может использоваться для определения двух следующих логических выражений «истина && ложь || истина» и «истина && (ложь || истина)».
Expr returns Expression:
Or;
Or returns Expression:
And (=> ({And.left=current} '||') right=And)*;
And returns Expression:
Lit (=> ({CmdAnd.left=current} '&&') right=Lit)*;
Lit returns Expression:
{BoolTrue} 'true' |
{BoolFalse} 'false'
'(' Expression ')';
В xtext форматирование выполняется путем отправки элемента модели EMF методам форматирования, например:
def dispatch void format(And and, extension IFormattableDocument document) {
}
Но в случае третьего производственного правила Lit (круглые скобки) тип не определен специально, что не позволяет мне выполнить отправку к этому синтаксическому элементу. Следовательно, я не могу найти способ определить свое правило форматирования для этой части моего синтаксиса.
Как определить мои правила форматирования скобок в таком контексте?