如何在xtext上修复一个简单的错误?

时间:2015-03-12 11:09:45

标签: eclipse compiler-errors uml dsl xtext

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

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'和'rul2)

  1. 当'当前'时,不允许未分配的规则调用 已经创建了。
  2. 无法在规则中更改类型两次
  3. 我想知道为什么我有这个错误以及如何解决它

1 个答案:

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