Форматирование производственных правил без вводимого типа

Иногда при определении грамматики 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 (круглые скобки) тип не определен специально, что не позволяет мне выполнить отправку к этому синтаксическому элементу. Следовательно, я не могу найти способ определить свое правило форматирования для этой части моего синтаксиса.

Как определить мои правила форматирования скобок в таком контексте?


person Manuel Leduc    schedule 12.03.2018    source источник


Ответы (1)


Я думаю, вам нужно сделать это на более высоком уровне, например.

@Inject extension DomainmodelGrammarAccess

def dispatch void format(Operation operation, extension IFormattableDocument document) {

    operation.allRegionsFor.keywords(XParenthesizedExpressionAccess.leftParenthesisKeyword_0).forEach [
        append[noSpace]
    ]
    operation.allRegionsFor.keywords(XParenthesizedExpressionAccess.rightParenthesisKeyword_2).forEach [
        prepend[noSpace]
    ]
person Christian Dietrich    schedule 13.03.2018