1

特定の形式の正式な表現を認識し、生成されたオブジェクト ツリーを 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
;

「カーディナリティ」の割り当てを除いて、すべて正常に機能します。

式は次のようになります:
text number(3) - (任意の量の文字の後に正確に 3 つの数字が続きます)
symbol number(2->) - (任意の量の特殊文字の後に少なくとも 2 つの数字が続きます)
whitespace number(- >4) - (任意の量の空白とそれに続く最大 4 つの数字)
number(3->6) - (少なくとも 3 つの数字で、6 つ以下の数字)

この文法を使用して Eclipse を実行すると (言語が認識され、コード補完などが行われるようにするため)、カーディナリティ値を除いて、入力したすべてがツリー構造として [アウトライン] タブに表示されます。
カーディナリティ ステートメントを CharMatcher に追加すると、その前に小さなプラスが表示されますが、クリックすると消えてしまいます。

これが機能しない理由を誰か教えてもらえますか?

4

1 に答える 1

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;

「アウトライン」タブにはまだ表示されていませんが、これは視覚化の問題だと思います。
生成されたクラスが意図したとおりに機能するようになりました。

于 2012-07-05T13:41:39.023 に答える