2

xtext 相互参照にいくつか問題があります。これは非常に単純な文法です。

grammar org.xtext.example.mydsl1.Test with org.eclipse.xtext.common.Terminals
generate test "http://www.xtext.org/example/mydsl1/Test"
Model: block=Block? cs+=Company* ; 
Block:  '{' g=[Employee] '}';
Company: 'Company' name=ID
    '{' es+= Employee* '}';
Employee: 'Employee' name=ID ';' ;

そしてそれは私のDSLです:

{ Pooyan }
Company Sony{
    Employee Pooyan;
    Employee John;
}

「従業員 'Pooyan' への参照を解決できませんでした」と常に表示されていました。誰でも私を助けてもらえますか?何も思いつきません...

4

2 に答える 2

4

Pooyan の完全修飾名は、Sony.Pooyan です。ブロック内の相互参照 'g' は別のコンテインで定義されているため、それをスコープに配置するためにマイナーなカスタマイズを行う必要があります。

  1. 言語が常にフラットな名前空間を使用している場合は、言語ジェネレーターで SimpleNamesFragment を有効にして、QualifiedNamesFragment を削除できます。これでうまくいくはずです。
  2. または、スコープ プロバイダーで具象参照 'g' のスコープをカスタマイズすることもできます。
于 2012-07-30T07:08:08.337 に答える
1

より正確にするためにセバスチャンの回答に追加します。xtext プロジェクトの対応する .mwe2 ファイルで、「fragment = exporting.QualifiedNamesFragment auto-inject {}」を「fragment = exporting.SimpleNamesFragment」に変更する必要があります。

お役に立てれば。

于 2014-08-06T00:29:30.043 に答える