Validation XText验证器在错误的行中显示分析错误

Validation XText验证器在错误的行中显示分析错误,validation,parsing,dsl,xtext,Validation,Parsing,Dsl,Xtext,我目前正在开发一个具有以下(短端)语法的小型dsl: 正如你所看到的,我使用分号作为EOL分隔符,它对我来说很好。在eclipse中使用dsl时,内置语法验证器会出现问题。当我漏掉分号时,验证程序会在错误的行中抛出语法错误: 我的语法有错误吗?谢谢;) 这里是一个基于您的示例的小型DSL。基本上,我不再认为线损是“隐藏的”(也就是说,它们不再被解析器忽略),而仅仅是空白区。注意语法标题中的新终端MY_WS和MY_NL以及修改的hidden语句(我还在相关位置添加了一些注释)。这种方法只是给了你

我目前正在开发一个具有以下(短端)语法的小型dsl:

正如你所看到的,我使用分号作为EOL分隔符,它对我来说很好。在eclipse中使用dsl时,内置语法验证器会出现问题。当我漏掉分号时,验证程序会在错误的行中抛出语法错误:


我的语法有错误吗?谢谢;)

这里是一个基于您的示例的小型DSL。基本上,我不再认为线损是“隐藏的”(也就是说,它们不再被解析器忽略),而仅仅是空白区。注意语法标题中的新终端
MY_WS
MY_NL
以及修改的
hidden
语句(我还在相关位置添加了一些注释)。这种方法只是给了你一些大概的想法,你可以用它来实现你想要的。请注意,如果换行符不再隐藏,则需要在语法规则中考虑它们

grammar org.xtext.example.mydsl.MyDsl
    with org.eclipse.xtext.common.Terminals
    hidden( MY_WS, SL_COMMENT )   // ---> hide whitespaces and comments only, not linebreaks!
generate mydsl "uri::mydsl"

CommandSet:
     (commands+=Command)*
;

CommandName:
    name=ID
;

ArgumentList:
   arguments += STRING (',' STRING)*
;

Command:
     (commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL);

terminal LBRACKET:
   '('
;
terminal RBRACKET:
   ')'
;
terminal EOL:
   ';' MY_NL?    // ---> now an optional linebreak at the end!
;

terminal MY_WS: (' '|'\t')+;    // ---> whitespace characters (formerly part of WS)
terminal MY_NL: ('\r'|'\n')+;   // ---> linebreak characters (no longer hidden)
下面是一幅演示结果行为的图像


xtext中没有EOL语义。应为Semikolon,但找到set关键字。这就是set标记错误的原因。如果您真的需要基于行的语法,那么您需要将WS从超语法拆分为WS和NL。感谢您提供详细的答案。我会考虑把LBS隐藏起来。
grammar org.xtext.example.mydsl.MyDsl
    with org.eclipse.xtext.common.Terminals
    hidden( MY_WS, SL_COMMENT )   // ---> hide whitespaces and comments only, not linebreaks!
generate mydsl "uri::mydsl"

CommandSet:
     (commands+=Command)*
;

CommandName:
    name=ID
;

ArgumentList:
   arguments += STRING (',' STRING)*
;

Command:
     (commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL);

terminal LBRACKET:
   '('
;
terminal RBRACKET:
   ')'
;
terminal EOL:
   ';' MY_NL?    // ---> now an optional linebreak at the end!
;

terminal MY_WS: (' '|'\t')+;    // ---> whitespace characters (formerly part of WS)
terminal MY_NL: ('\r'|'\n')+;   // ---> linebreak characters (no longer hidden)