XText Validator 在错误的行中显示解析错误
XText Validator shows Parse Error in wrong line
我目前正在开发一个具有以下(缩写)语法的小型 dsl:
grammar mydsl with org.eclipse.xtext.common.Terminals hidden(WS, SL_COMMENT)
generate mydsl "uri::mydsl"
CommandSet:
(commands+=Command)*
;
Command:
(commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL ) |
;
terminal LBRACKET:
'('
;
terminal RBRACKET:
')'
;
terminal EOL:
';'
;
如您所见,我使用分号作为 EOL 分隔符,它对我来说效果很好。在 eclipse 中使用 dsl 时,内置语法验证器会出现问题。当我错过分号时,验证器会在错误的行中抛出语法错误:
我的语法有问题吗?谢谢 ;)
这是一个基于您的示例的小型 DSL。基本上,我不再将换行符视为 "hidden"(即它们将不再被解析器忽略),只有空格。注意语法头中新的终端 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)
这是一张演示结果行为的图片。
我目前正在开发一个具有以下(缩写)语法的小型 dsl:
grammar mydsl with org.eclipse.xtext.common.Terminals hidden(WS, SL_COMMENT)
generate mydsl "uri::mydsl"
CommandSet:
(commands+=Command)*
;
Command:
(commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL ) |
;
terminal LBRACKET:
'('
;
terminal RBRACKET:
')'
;
terminal EOL:
';'
;
如您所见,我使用分号作为 EOL 分隔符,它对我来说效果很好。在 eclipse 中使用 dsl 时,内置语法验证器会出现问题。当我错过分号时,验证器会在错误的行中抛出语法错误:
我的语法有问题吗?谢谢 ;)
这是一个基于您的示例的小型 DSL。基本上,我不再将换行符视为 "hidden"(即它们将不再被解析器忽略),只有空格。注意语法头中新的终端 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)
这是一张演示结果行为的图片。