这是我的例子,向您展示我需要调用两个规则的问题
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)
我想知道为什么我有这个错误以及如何解决它
答案 0 :(得分:1)
由于您对规则rule
rule:
rul1 'and' rul2
;
据我所知,rule
有两个属性,rul1
和rul2
。但在您的实现中rule
没有任何属性。要将rul1
和rul2
定义为属性,您已将这些元素分配给属性。这看起来像这样:
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