2017-03-23 80 views
0

我是XText的新手,并且想要定义用于指定值范围的语言元素。实施例:[1-2]或[0.1-0.3 [Xtext中的范围规范

我有用于此目的的以下规则:

Range returns Expression: 
Atomic (leftBracket=('[' | ']') left=Atomic '-' right=Atomic rightBracket=('[' | ']'))*; 

原子这里基本上是指原始的浮子和int类型。我有两个问题:

  1. 我得到警告“功能的赋值‘LEFTBRACKET’将有可能改写本身,因为它是一个循环内用”与同为RIGHTBRACKET。这在这方面意味着什么?
  2. 该表达式仅以独立方式(在一行中)工作,但与其余语言元素无关。例如。在右边的前一个元素连接:

    Comparison returns Expression: 
    Range ({Comparison.left=current} op=(">="|"<="|">"|"<"|"=>"|" <=>"|"xor"|"=") right=Range)*; 
    

    这意味着,如果这样的操作在我的第二Eclipse窗口的输入范围元素之前,我得到的错误“在输入没有可行的替代方案”。

任何想法?感谢您的任何提示和建议!

一些更多信息: 我把这个例子和改变了它: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]在一排工作正常。

回答

1

我真的不能跟着你,但你的语法看起来很奇怪,我

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; 

使您能不能给一些更多的上下文

+0

非常感谢您的回答。事实上,这与你的语法一致。我用完整的例子和我的更改更新了我的问题。我试着用Range表达式中的Atomic和Primary元素。这没有任何区别。 – mapf

+0

我还不理解你的范围表达式,为什么它是主要范围+ –

+0

如果我用你的Range表达式替换它,它的工作原理很好。我真的不明白它有什么区别,但它有效。没有警告或错误。谢谢! – mapf