2

我正在 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 中实现这一点。有人可以帮忙吗?

谢谢帮忙。

4

2 回答 2

3

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

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

CONDITION_LEVEL:
    NUMBER
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'
于 2011-08-18T12:09:37.653 回答
3

尝试这个:

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

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

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

此外,您可能不想用空格包围您的操作符标记,而是将它们放在隐藏解析器通道上:

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

...

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

...

否则像这样的源将失败:

1 AND(2 OR 3)

有关详细信息,请参阅XText 用户指南中的隐藏终端符号

于 2011-08-18T12:21:38.057 回答