【问题标题】:how to fix a simple error on xtext?如何修复 xtext 上的简单错误?
【发布时间】:2015-03-12 11:09:44
【问题描述】:

这是我的示例,向您展示我需要调用两个规则的问题

generate umlDsl "http://www.xtext.org/example/umldsl/UmlDsl"

Model:
elements+=rule*
;
rule:
   rul1 'and' rul2
;

rul1:
   'rul1' action1=[uml::Action|FQN]
;                       

rul2:
    'rul2' action2=[uml::Action|FQN]
;

FQN returns ecore::EString:
   ID ("." ID)*
;

我有这个错误

这一行有多个标记(rul1 'and' rul2)

  1. 不允许未分配的规则调用,当“当前” 已创建。
  2. 不能在规则内两次更改类型

我想知道为什么会出现这个错误以及如何解决它

【问题讨论】:

    标签: eclipse compiler-errors uml dsl xtext


    【解决方案1】:

    这些错误是由于您对规则 rule 的规则实现而发生的

    rule:
       rul1 'and' rul2
    ;
    

    据我了解,rule 有两个属性,rul1rul2。但是在您的实现中 rule 没有任何属性。要将rul1rul2 定义为属性,您必须将这些元素分配给一个属性。这可能如下所示:

    rule:
       rul1=rul1 'and' rul2=rul2
    ;
    

    您是否查看过 Xtext 文档 [1] 以了解语法语言的语法和语义?

    您需要了解以下内容以了解您的错误:

    解析器规则的属性需要一个名称。您为此名称分配一个值,该值是其他解析器规则名称。这类似于在 Java 中为字段赋值:

    int i = 42;
    

    字段声明由字段类型 (int) 和字段名称 (i) 组成,通常后面跟着赋值运算符 (=) 和值 (42)。解析器规则的属性定义遵循以下方案:

    RuleA: 'some syntax' attributeName=OtherRule 'more syntax';
    OtherRule: 'other syntax' attribute=NextRule ... ;
    ...
    

    Xtexts 语法语言中的解析器规则类似于 Java 类。 RuleName 对应于 class ClassName。然后你可以用'keyword' 定义一些静态语法。如果任何其他规则中应该出现任何其他规则,则可以将其理解为字段声明。该规则是一个属性,其实现方式如下:

    attributeName=AnyRule
    

    其中attributeName 对应于字段名称。但是为属性分配值的类型 (AnyRule)。

    顺便说一句。我强烈建议规则名称应以大写字母开头,属性名称应以小写字母开头。

    [1]https://www.eclipse.org/Xtext/documentation/301_grammarlanguage.html

    【讨论】:

    • 谢谢,我还有一个问题,因为文档中没有提到一些特殊情况,例如: predex : '{'exp0=exp ((('and'|'or' ) exp1=exp )*)?'}' ;我希望它像这样 {action}{action and action}{action or action and action).... 但我只在编辑器中得到第一个和第二个案例,我的意思是使用 (or|and) 甚至一次使用'*'
    • 你到底想要什么?我不明白您想要一个带有操作andor 的表达式树。为此,请查看blog.efftinge.de/2010/08/parsing-expressions-with-xtext.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2016-06-22
    • 1970-01-01
    • 2017-08-09
    • 2019-12-09
    • 2022-10-20
    • 1970-01-01
    相关资源
    最近更新 更多