2012-07-04 68 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(這樣我的語言被識別並具有代碼完成等等)時,我輸入的所有內容都顯示在「Outline」除了基數值以外,它應該像樹形結構一樣。
當我添加一個基數語句到一個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