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

发布于 2024-11-30 08:56:05 字数 709 浏览 1 评论 0原文

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

谢谢你的帮助。

I am developing my own DSL in XText.

I want do something like this:

1 AND (2 OR (3 OR 4))

Here my current .xtext file:

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 ')'*
;

The problem I am having is that the dsl should have the possibility to make unlimited bracket, but show an error when the programmer don't closes all opened bracket.

example:

1 AND (2 OR (3 OR 4)

one bracket is missing --> should make error.

I don't know how I can realize this in XText. Can anybody help?

thx for helping.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白云悠悠 2024-12-07 08:56:05

试试这个:

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

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

请注意,我没有使用 XText 的经验(所以我没有测试这个),但这确实适用于 ANTLR,XText 是在 ANTLR 上构建的(或者也许它只使用 ANTLR...)。

另外,您可能不想用空格包围运算符令牌,而是将它们放在隐藏解析器通道上:

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

...

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

...

否则这样的源将失败:

1 AND(2 OR 3)

有关详细信息,请参阅 隐藏终端符号

Try this:

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

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

Note that I have no experience with XText (so I did not test this), but this does work with ANTLR, on which XText is built (or perhaps it only uses ANTLR...).

Aslo, you probably don't want to surround your operator-tokens with spaces, but put them on a hidden-parser channel:

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

...

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

...

Otherwise source like this would fail:

1 AND(2 OR 3)

For details, see Hidden Terminal Symbols from the XText user guide.

氛圍 2024-12-07 08:56:05

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

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

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

You need to make your syntax recursive. The basic idea is that a CONDITION_LEVEL can be, for example, two CONDITION_LEVEL separated by an OPERATOR.

I don't know the specifics of the xtext syntax, but using a BCNF-like syntax you could have:

CONDITION_LEVEL:
    NUMBER
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文