2015-03-12 1 views
0

это мой пример, чтобы показать вам эту проблему, мне нужно позвонить два правилаКак исправить простую ошибку в 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. Невозможно изменить тип дважды в правиле

Я хочу знать, почему у меня эта ошибка и как ее исправить, пожалуйста

ответ

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), это обычно является followd оператором присваивания (=) и значение (42). Атрибут Definiton из правила синтаксического анализа по следующей схеме:

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

+0

спасибо, у меня есть еще один вопрос, пожалуйста, потому что есть некоторые частные случаи, не упомянутые в документации , например: predex: \t '{' exp0 = ехр ((('и' | 'или') exp1 = exp) *)? '}' \t \t ; \t \t Я хочу, чтобы это было так {действие} {действие и действие} {действие или действие и действие) .... но я получаю только первые и вторые случаи в редакторе, я имею в виду, используя (или | и) всего один раз даже при использовании '*' – abdozmeir

+0

Что именно вы хотите? Я понимаю, что вы хотите иметь дерево выражений с операциями 'and' или' or'. Для этого взгляните на http://blog.efftinge.de/2010/08/parsing-expressions-with-xtext.html. – Joko