Eclipse 使用语义换行符创建Xtext语法时遇到问题

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

我刚刚开始使用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 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。这根线应该羞耻地合上/