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
}
出于测试目的,我想用我的 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
}