2012-07-04 6 views
1

Я построил грамматику в xText, чтобы распознать формальные выражения определенного формата и использовать сгенерированное дерево объектов в Java.
Это то, что он выглядит следующим образом:xText Назначение переменной/атрибута

grammar eu.gemtec.device.espa.texpr.Texpr with org.eclipse.xtext.common.Terminals 

generate texpr "http://www.gemtec.eu/device/espa/texpr/Texpr" 

Model: 
    (expressions+=AbstractExpression)* 
; 

AbstractExpression: 
    MatcherExpression | Assignment; 

MatcherExpression: 
    TerminalMatcher ({Operation.left=current} operator='or' right= MatcherExpression)? 
; 

TerminalMatcher returns MatcherExpression: 
    '(' MatcherExpression ')' | {MatcherLiteral} value=Literal 
; 

Literal: 
    CharMatcher | ExactMatcher 
; 

CharMatcher: 
    type=('text'|'number'|'symbol'|'whitespace') ('(' cardinality=Cardinality ')')? 
; 

/* Kardinalitäten für CharMatcher*/ 
Cardinality: 
    CardinalityMin | CardinalityMinMax | CardinalityMax| CardinalityExact 
; 
CardinalityMin:   min=INT '->'; 
CardinalityMinMax:  min=INT '->' max=INT; 
CardinalityMax:     '->' max=INT; 
CardinalityExact:  exact=INT; 

ExactMatcher: 
    (ignoreCase='ignoreCase''(' expected=STRING ')') | expected=STRING 
; 

/* Variablenzuweisung 
* 
* z.B. $myVar=number 
* */ 
Assignment: 
    '$' name=ID '=' expression=MatcherExpression 
; 

Все отлично для «мощности» уступки, за исключением работ.

Выражений выглядят следующим образом:
номер текст (3) - (произвольное количество букв следует ровно 3 цифр)
номер символа (2->) - (произвольное количество специальных символов следует в не более 2-х номеров)
пробел номер (-> 4) - (произвольное количество пробелов, за которым следует максимум 4 номера)
номер (3-> 6) - (не менее 3 цифр, но не более 6)

Когда я запускаю Eclipse с помощью этой грамматики (так, что мой язык распознан и имеет завершение кода и т. Д.), Все, что я набираю, показано в «Контур», -tab как древовидная структура, как следует, за исключением значений мощности.
Когда я добавляю заявление о мощности в CharMatcher, перед ним появляется маленький плюс, но когда я нажимаю на него, он просто исчезает.

Может ли кто-нибудь сказать мне, почему это не работает?

ответ

0

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

Cardinality: 
CardinalityMin | CardinalityMinMax | CardinalityMax| CardinalityExact 
; 

CardinalityMin:   min=INT '->'; 
CardinalityMinMax:  min=INT '->' max=INT; 
CardinalityMax:     '->' max=INT; 
CardinalityExact:  exact=INT; 

Так что я упростил все это дело немного, он теперь выглядит следующим образом :

Cardinality: 
    CardinalityMinMax | CardinalityExact 
; 

CardinalityMinMax: (min=INT '..' max=INT) | (min=INT '..') | ('..' max=INT); 
CardinalityExact: exact=INT; 

это еще не показано в «Outline» -Tab, но я полагаю, что это проблема визуализации.
Сгенерированные классы теперь работают по назначению.

+0

Да, у меня была такая же проблема и применено то же решение. – Aubin

Смежные вопросы