【问题标题】:Range Specification in XtextXtext 中的范围规范
【发布时间】:2017-03-23 16:27:28
【问题描述】:

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

为此,我有以下规则:

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

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

  1. 我收到警告“功能 'leftBracket' 的分配值可能会覆盖自身,因为它在循环内部使用”,对于 rightBracket 也是如此。在这种情况下,这意味着什么?
  2. 该表达式仅以独立的方式(在一行中)起作用,但与其他语言元素无关。例如。与之前的元素有关:

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

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

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

更多信息: 我拿了这个例子并改了: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] 可以正常工作。

【问题讨论】:

    标签: dsl xtext


    【解决方案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;
    

    所以你能提供更多的上下文

    【讨论】:

    • 非常感谢您的回答。确实,这适用于您的语法。我用完整的例子更新了我的问题以及我对它的更改。我尝试使用 Range 表达式中的 Atomic 和 Primary 元素。这没有任何区别。
    • 我还是不明白你的范围表达,为什么是Primary rangestuff+
    • 如果我用你的替换我的 Range 表达式,它工作得很好。我真的不明白有什么区别,但它有效。没有警告或错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多