Xtext 使用不同于最上面的解析器规则的另一个解析器规则解析文本

Xtext Parse text using another parser rule than the top one

出于测试目的,我想用我的 Xtext 语言解析一个独立的表达式。

在我的测试中,我可以使用 ParseHelper<Model> 解析完整的模型,例如,

val model = parseHelper.parse('''function { 1 + 2 }''')

是否可以用类似的方式解析一个独立的表达式?我试过注入 ParseHelper<Expression> 并写入

val expr = parseHelper.parse('''1 + 2''')

但是这个 returns null 出于某种原因。


以上示例基于以下虚拟语法。

Model:
    functions+=Function*
;

Function:
    'function' '{' Expression '}'
;

Expression:
      Addition
;
Addition returns Expression:
    Literal (=>({Addition.left=current} '+') right=Literal)*
;
Literal returns Expression:
    INT
;

您也可以直接使用IParser。要解析一条规则,您可以执行以下操作:

@Inject IParser parser  // inject the parser
@Inject <Your-Lang-Name-Here>GrammarAccess grammar  // inject your IGrammarAccess

@Test
def void testPartialParse() {
    val expression = '''1 + 2'''
    val IParseResult result = parser.parse(grammar.expressionRule, new StringReader(expression)) // partial parsing here
    assertNotNull(result.rootASTElement)  // rootASTElement should be your Addition
}