拥有 XText 的 DSL。无限括号(“(”,“)”)的问题
我正在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个:
请注意,我没有使用 XText 的经验(所以我没有测试这个),但这确实适用于 ANTLR,XText 是在 ANTLR 上构建的(或者也许它只使用 ANTLR...)。
另外,您可能不想用空格包围运算符令牌,而是将它们放在隐藏解析器通道上:
否则这样的源将失败:
有关详细信息,请参阅 隐藏终端符号。
Try this:
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:
Otherwise source like this would fail:
For details, see Hidden Terminal Symbols from the XText user guide.
您需要使语法递归。基本思想是,
CONDITION_LEVEL
可以是由OPERATOR
分隔的两个CONDITION_LEVEL
。我不知道 xtext 语法的细节,但使用类似 BCNF 的语法你可以有:
You need to make your syntax recursive. The basic idea is that a
CONDITION_LEVEL
can be, for example, twoCONDITION_LEVEL
separated by anOPERATOR
.I don't know the specifics of the xtext syntax, but using a BCNF-like syntax you could have: