XTEXT:控制何时允许空格

时间:2015-07-07 18:59:22

标签: whitespace dsl xtext

我有自定义脚本语言,我试图使用XTEXT进行语法检查。它归结为格式为

的单行命令
COMMAND:PARAMETERS

在大多数情况下,xtext工作得很好。我目前遇到的唯一问题是如何处理想要的(或不需要的)空格。该语言没有空格来开始一行,并且冒号后面不能有空格。同样,我需要在参数中允许空格,因为它可能是一串文本或类似的东西。

我使用数据类型在参数中允许空格:

UNQUOTED_STRING:
    (ID | INT | WS | '.' )+
;

这样做有效,但是在整个生产线上都有空间。

有没有人知道限制允许使用空格的方法?

提前感谢任何建议!

1 个答案:

答案 0 :(得分:3)

您可以使用一组空的隐藏令牌来全局禁止使用空格,例如。

grammar org.xyz.MyDsl with org.eclipse.xtext.common.Terminals hidden()

然后您可以根据特定规则启用它,例如

XParameter hidden(WS):
    'x' '=' value=ID
;

请注意,这也允许换行。如果您不想要,可以传递自定义终端规则或覆盖默认的WS规则。

这是一个更完整的例子(不完美):

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals hidden()

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    (commands+=Command '\r'? '\n')+
;

Command:
    SampleCommand
;

SampleCommand:
    command='get' ':' parameter=Parameter 
;

Parameter:
    '{' x=XParameter '}'
;

XParameter hidden(WS):
    'x' '=' value=ID
;

这将解析命令,例如:

get:{x=TEST}
get:{ x =  TEST}

但是会拒绝:

 get:{x=TEST}
get: {x=TEST}

希望能给你一个想法。您也可以通过仅限于某些规则限制空白来反过来执行此操作,例如

CommandList hidden():
    (commands+=Command '\r'? '\n')+
;

如果这对你的语法更有效。