Xtext中的范围规范

时间:2017-03-23 16:27:28

标签: dsl xtext

我是XText的新手,想要定义一个用于指定值范围的语言元素。例子:[1-2]或] 0.1-0.3 [

我为此目的有以下规则:

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

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

  1. 我收到了警告"功能的指定值&left; #Bracket'可能会覆盖自己,因为它是在一个循环中使用的#34;和rightBracket相同。在这种情况下,这意味着什么?
  2. 表达式仅以独立方式(在一行中)起作用,但不与其他语言元素相关联。例如。与之前的元素有关:

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

    这意味着,如果这样的操作在我的第二个Eclipse窗口的输入中的Range元素之前,我得到错误&#34;在输入时没有可行的替代方案&#34;。

  3. 有什么想法吗?感谢任何提示和建议!

    更多信息: 我拿了这个例子并改了它: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 个答案:

答案 0 :(得分: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;

所以你可以提供一些更多的背景