Xtext 中的范围规范
Range Specification in Xtext
我是 XText 的新手,想定义一个语言元素来指定值的范围。示例:[1-2] 或 ]0.1-0.3[
为此我制定了以下规则:
Range returns Expression:
Atomic (leftBracket=('[' | ']') left=Atomic '-' right=Atomic rightBracket=('[' | ']'))*;
这里的原子基本上指的是原始的float和int类型。我有两个问题:
- 我收到警告 "The assigned value of feature 'leftBracket' will possibly override itself because it is used inside of a loop" 并且 rightBracket 也是如此。这在这种情况下意味着什么?
该表达式仅以独立方式(在一行中)起作用,但与其余语言元素无关。例如。与之前的元素有关:
Comparison returns Expression:
Range ({Comparison.left=current} op=(">="|"<="|">"|"<"|"=>"|" <=>"|"xor"|"=") right=Range)*;
这意味着,如果这样的操作在我输入的第二个 Eclipse window 中的 Range 元素之前,我会得到错误 "No viable alternative at input"。
有什么想法吗?感谢您的任何提示和建议!
更多信息:
我把这个例子改成了:https://github.com/LorenzoBettini/packtpub-xtext-book-examples/blob/master/org.example.expressions/src/org/example/expressions/Expressions.xtext
完整代码:
grammar org.example.expressions.Expressions with org.eclipse.xtext.common.Terminals
generate expressions "http://www.example.org/expressions/Expressions"
ExpressionsModel:
expressions+=Expression*;
Expression: Or;
Or returns Expression:
And ({Or.left=current} "||" right=And)*
;
And returns Expression:
Equality ({And.left=current} "&&" right=Equality)*
;
Equality returns Expression:
Comparison (
{Equality.left=current} op=("==")
right=Comparison
)*
;
Comparison returns Expression:
Range ({Comparison.left=current} op=(">="|"<="|">"|"<"|"=>"|"<=>"|"xor"|"=") right=Range)*
;
Range returns Expression:
Primary (leftBracket=('[' | ']') left=Primary '-' right=Primary rightBracket=('[' | ']'))*
;
Primary returns Expression:
'(' Expression ')' |
{Not} "!" expression=Primary |
Atomic
;
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true'|'false')
;
失败示例:(1 = [1-2]) 但是连续 [1-2] 工作正常。
我真的听不懂你的意思,但我觉得你的语法很奇怪
Model:
(expressions+=Comparison ";")*;
Comparison returns Expression:
Range ({Comparison.left=current} op=(">=" | "<=" | ">" | "<" | "=>" | "<=>" | "xor" | "=") right=Range)*;
Range:
(leftBracket=('[' | ']') left=Atomic '-' right=Atomic rightBracket=('[' | ']'))
|
Atomic;
Atomic:
value=INT;
适用于
[1-2];
]3-5[;
[1-4[ < ]1-6];
6;
1 < 2;
所以你能再提供一些上下文吗
我是 XText 的新手,想定义一个语言元素来指定值的范围。示例:[1-2] 或 ]0.1-0.3[
为此我制定了以下规则:
Range returns Expression:
Atomic (leftBracket=('[' | ']') left=Atomic '-' right=Atomic rightBracket=('[' | ']'))*;
这里的原子基本上指的是原始的float和int类型。我有两个问题:
- 我收到警告 "The assigned value of feature 'leftBracket' will possibly override itself because it is used inside of a loop" 并且 rightBracket 也是如此。这在这种情况下意味着什么?
该表达式仅以独立方式(在一行中)起作用,但与其余语言元素无关。例如。与之前的元素有关:
Comparison returns Expression: Range ({Comparison.left=current} op=(">="|"<="|">"|"<"|"=>"|" <=>"|"xor"|"=") right=Range)*;
这意味着,如果这样的操作在我输入的第二个 Eclipse window 中的 Range 元素之前,我会得到错误 "No viable alternative at input"。
有什么想法吗?感谢您的任何提示和建议!
更多信息: 我把这个例子改成了:https://github.com/LorenzoBettini/packtpub-xtext-book-examples/blob/master/org.example.expressions/src/org/example/expressions/Expressions.xtext
完整代码:
grammar org.example.expressions.Expressions with org.eclipse.xtext.common.Terminals
generate expressions "http://www.example.org/expressions/Expressions"
ExpressionsModel:
expressions+=Expression*;
Expression: Or;
Or returns Expression:
And ({Or.left=current} "||" right=And)*
;
And returns Expression:
Equality ({And.left=current} "&&" right=Equality)*
;
Equality returns Expression:
Comparison (
{Equality.left=current} op=("==")
right=Comparison
)*
;
Comparison returns Expression:
Range ({Comparison.left=current} op=(">="|"<="|">"|"<"|"=>"|"<=>"|"xor"|"=") right=Range)*
;
Range returns Expression:
Primary (leftBracket=('[' | ']') left=Primary '-' right=Primary rightBracket=('[' | ']'))*
;
Primary returns Expression:
'(' Expression ')' |
{Not} "!" expression=Primary |
Atomic
;
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true'|'false')
;
失败示例:(1 = [1-2]) 但是连续 [1-2] 工作正常。
我真的听不懂你的意思,但我觉得你的语法很奇怪
Model:
(expressions+=Comparison ";")*;
Comparison returns Expression:
Range ({Comparison.left=current} op=(">=" | "<=" | ">" | "<" | "=>" | "<=>" | "xor" | "=") right=Range)*;
Range:
(leftBracket=('[' | ']') left=Atomic '-' right=Atomic rightBracket=('[' | ']'))
|
Atomic;
Atomic:
value=INT;
适用于
[1-2];
]3-5[;
[1-4[ < ]1-6];
6;
1 < 2;
所以你能再提供一些上下文吗