格式化没有推断类型的生产规则
Formatting production rules without infered type
有时,在定义 Xtext 语法时,我定义了没有推断类型的产生式规则。
例如,在定义表达式语言时,括号可以用来处理运算符的优先级,但不一定是元模型中的类型。
例如下面的语法可以用来定义下面两个布尔表达式"true && false || true"和"true && (false || true)"。
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 的第三个生产规则(括号)的情况下,故意没有定义类型,这阻止了我派发到这个句法元素。
因此,我找不到一种方法来为这部分语法定义格式规则。
如何在这种情况下定义括号的格式规则?
我认为你必须在更高的层次上做到这一点,例如
@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]
]
有时,在定义 Xtext 语法时,我定义了没有推断类型的产生式规则。
例如,在定义表达式语言时,括号可以用来处理运算符的优先级,但不一定是元模型中的类型。
例如下面的语法可以用来定义下面两个布尔表达式"true && false || true"和"true && (false || true)"。
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 的第三个生产规则(括号)的情况下,故意没有定义类型,这阻止了我派发到这个句法元素。 因此,我找不到一种方法来为这部分语法定义格式规则。
如何在这种情况下定义括号的格式规则?
我认为你必须在更高的层次上做到这一点,例如
@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]
]