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