Eclipse 使用语义换行符创建Xtext语法时遇到问题
我刚刚开始使用Xtext,在语义上使用换行符时遇到了一些问题(换行符会影响lexer分配片段的方式) 下面是一个非常简单的测试用例:Eclipse 使用语义换行符创建Xtext语法时遇到问题,eclipse,antlr,xtext,Eclipse,Antlr,Xtext,我刚刚开始使用Xtext,在语义上使用换行符时遇到了一些问题(换行符会影响lexer分配片段的方式) 下面是一个非常简单的测试用例: Feature: The quick brown fox Jumps over The lazy dog 使用此语法分析此文本时 grammar com.example.model.Model hidden(WS) import "http://www.eclipse.org/emf/2002/Ecore" as ecore generate
Feature: The quick brown fox
Jumps over
The lazy dog
使用此语法分析此文本时
grammar com.example.model.Model hidden(WS)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate model "http://www.example.com/model"
Feature:
'Feature' ':' title=Title NL+
narrative=Narrative?;
Title:
(WORD) (WORD)*;
Narrative:
((WORD) (WORD)* NL+)+;
terminal WORD: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z')*;
// WS should not include newlines because it is semantic
terminal WS: (' ' | '\t');
terminal NL: ('\r'? '\n');
我希望标题包含“敏捷的棕色狐狸”,叙事包含“跳过懒狗”
但是相反,我得到了一个org.eclipse.xtext.diagnostics.diagnostics.Syntax
错误的外部输入'\n'应为'Feature'
但是,如果我从示例文本中删除叙述,我不会得到正确分配标题的解析错误
我看过很多例子,但是这些都是针对非常大和复杂的语言,或者有非常清晰的开始/结束标记来匹配的
有谁能解释一下,在这个非常简单的案例中,我的期望在哪里失败了
更新
显然我的期望是正确的,我的测试用例失败了
@RunWith(XtextRunner)
@InjectWith(CucumberInjectorProvider)
class ValidationTest {
static void assertThatValidation(List<Issue> issues, Matcher matches) {
assertThat(issues, matches)
}
static Matcher hasNoIssues() {
return emptyCollectionOf(Issue)
}
static Matcher theError(String expectedCode) {
return allOf(hasProperty("code", equalTo(expectedCode)),
hasProperty("severity", equalTo(Severity.ERROR)))
}
static Matcher theWarning(String expectedCode) {
return allOf(hasProperty("code", equalTo(expectedCode)),
hasProperty("severity", equalTo(Severity.WARNING)))
}
@Inject
ParseHelper<Feature> parserHelper
@Inject
ValidationTestHelper validationTestHelper
List<Issue> whenParsing(String content) {
Feature model = parserHelper.parse(content.stripIndent())
assertThat(model, not(null))
return validationTestHelper.validate(model)
}
@Test
void featureWithSimpleTitle() {
assertThatValidation whenParsing("Feature: Hello World\n"),
hasNoIssues()
}
@Test
void featureWithSimpleTitleAndNarrative() {
def input = '''
Feature: The quick brown fox
Jumps over
The lazy dog
'''
assertThatValidation whenParsing(input), hasNoIssues()
}
}
@RunWith(XtextRunner)
@注射用(黄瓜注射机)
类验证测试{
静态无效资产验证(列出问题、匹配器匹配){
资产(发行、匹配)
}
静态匹配器hasNoIssues(){
返回空集合(问题)
}
静态匹配器错误(字符串预期代码){
返回allOf(hasProperty(“code”,equalTo(expectedCode)),
hasProperty(“严重性”,等于(严重性.错误)))
}
静态匹配器警告(字符串预期代码){
返回allOf(hasProperty(“code”,equalTo(expectedCode)),
hasProperty(“严重性”,等同于(严重性.警告)))
}
@注入
ParseHelper parserHelper
@注入
ValidationTestHelper ValidationTestHelper
编辑时的列表(字符串内容){
Feature model=parserHelper.parse(content.stripIndent())
资产(模型,非(空))
返回validationTestHelper.validate(模型)
}
@试验
void特性与simpletitle(){
assertThatValidation在发布时(“功能:Hello World\n”),
hasNoIssues()
}
@试验
虚空功能,带有简单和叙述(){
def输入=“”
特征:敏捷的棕色狐狸
跳过
懒狗
'''
AssertThavalization在进行(输入)验证时,存在噪音()
}
}
但这似乎没问题
@RunWith(XtextRunner)
@InjectWith(CucumberInjectorProvider)
class CucumberParsingTest {
@Inject
ParseHelper<Feature> parseHelper
@Test
def void loadModel() {
val result = parseHelper.parse('''
Feature: The quick brown fox
Jumps over
The lazy dog
''')
Assert.assertNotNull(result)
val errors = result.eResource.errors
Assert.assertTrue('''Unexpected errors: «errors.join(", ")»''', errors.isEmpty)
}
}
@RunWith(XtextRunner)
@注射用(黄瓜注射机)
黄瓜类试验{
@注入
ParseHelper ParseHelper
@试验
def void loadModel(){
val result=parseHelper.parse(“”)
特征:敏捷的棕色狐狸
跳过
懒狗
''')
Assert.assertNotNull(结果)
val errors=result.eResource.errors
Assert.assertTrue(“”“意外错误:«errors.join(“,“”»)”,errors.isEmpty)
}
}
很抱歉,我的问题太离题了。无法用您给出的语法和示例重现此问题=>您能不能也提供一个不合格的单元测试。哦,不,这是一个骗局!显然它不喜欢我的Groovy测试。你知道XTest测试的不同之处是什么,这样我就可以确保我的字符串被正确地传递到parserHelper吗?我不知道Srymaye,因为groovy模型是从一个
\n
开始的是的,groovy处理新行的方式有一些奇怪的差异。我最终放弃了Groovy,学习了XTend。这根线应该羞耻地合上/无法用你给出的语法和示例重现这个=>你能不能也提供一个不合格的单元测试。哦,不,这是一个骗局!显然它不喜欢我的Groovy测试。你知道XTest测试的不同之处是什么,这样我就可以确保我的字符串被正确地传递到parserHelper吗?我不知道Srymaye,因为groovy模型是从一个\n
开始的是的,groovy处理新行的方式有一些奇怪的差异。我最终放弃了Groovy,学习了XTend。这根线应该羞耻地合上/