拥有XText的DSL。无限括号问题(“(”,“)”)

时间:2011-08-18 12:01:31

标签: java dsl xtext

我正在使用XText开发自己的DSL。

我想做这样的事情:

1 AND (2 OR (3 OR 4))

这是我当前的.xtext文件:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

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

Model:
    (greetings+=CONDITION_LEVEL)
;

terminal NUMBER :
    ('1'..'9') ('0'..'9')*
;

AND:
    ' AND '
;

OR:
    ' OR '
;

OPERATOR : 
    AND | OR
;

CONDITION_LEVEL:
    ('('* NUMBER (=>')')* OPERATOR)+ NUMBER ')'*
;

我遇到的问题是dsl应该有可能无限制括号,但是当程序员没有关闭所有打开的括号时显示错误。

示例:

1 AND (2 OR (3 OR 4)

缺少一个括号 - >应该犯错误。

我不知道如何在XText中实现这一点。有人可以帮忙吗?

这是帮助。

2 个答案:

答案 0 :(得分:3)

您需要使语法递归。基本的想法是,CONDITION_LEVEL可以是两个CONDITION_LEVEL,由OPERATOR分隔。

我不知道xtext语法的细节,但是你可以使用类似BCNF的语法:

CONDITION_LEVEL:
    NUMBER
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'

答案 1 :(得分:3)

试试这个:

CONDITION_LEVEL
  :  ATOM ((AND | OR) ATOM)*
  ;

ATOM 
  :  NUMBER 
  |  '(' CONDITION_LEVEL ')'
  ;

请注意,我没有使用XText的经验(所以我没有对此进行测试),但这适用于构建XText的ANTLR(或者它可能只使用ANTLR ......)。

Aslo,你可能不想用空格包围你的操作符,但是把它们放在一个隐藏的解析器通道上:

grammar org.xtext.example.mydsl.MyDsl hidden(SPACE)

...

terminal SPACE : (' '|'\t'|'\r'|'\n')+;

...

否则这样的来源会失败:

1 AND(2 OR 3)

有关详细信息,请参阅XText用户指南中的Hidden Terminal Symbols