4

これには簡単な解決策があることは知っていますが、それを実装する方法がわかりません。

何をする必要があるかではなく、答えを実装する方法を探しています。答えの半分はすでにこのページにあります: Xtext 相互参照とスコープ

私の問題は、以下の文法にあります。

DomainModel:
    "DOMAINMODEL" name=ID "{"
        "ENTITYS" "{"
            (Entitys+=Entity)*
        "}"
        "ENTITY_RELATIONSHIP" "{"
            (Relationships+=Relationship)*
        "}" 
    "}";

Entity:
    name=ID "{"
        (Attributes+=Attribute)*
    "}";

Attribute:
    StringAttribute | NumberAttribute | ImageAttribute;

StringAttribute:
    "STRING" name=ID;

NumberAttribute:
    "NUMBER" name=ID;

ImageAttribute:
    "IMAGE" name=ID;

// Relationship = [new table name] : [shared key name] -> ref_table(ref_id)
Relationship:
    name=ID ":" newEntityName=ID "->" refEntityName=[Entity|ID]"("refName=[Attribute|ID]")"; // <- Problem here

モデルを作成するときに、エンティティ内の属性を参照するための "refName=[Attribute|ID]" を取得できません。以下のコードで

DOMAINMODEL auctionHouse{
    ENTITYS {

       lots{      
          NUMBER id0
          NUMBER lotNo
          STRING name
          STRING priceEstimate
          STRING description
       }  
       auctions{
          NUMBER id1
          NUMBER date
          STRING description
       }
       auction_lots{
          NUMBER id2
          STRING lot_id
          NUMBER auction_id
       }

    }

    ENTITY_RELATIONSHIP {
        auction_lots : lot_id -> lots(id0) // <- Will not find 'id0'
        auction_lots : auction_id -> auctions(id1) // <- Will not find 'id1'
    }

}

どうすれば範囲を広げることができますか?名前が同じでスコープが異なる 2 つの属性を区別するにはどうすればよいですか?

4

1 に答える 1

5

参照に関する問題は、それらが単にその範囲内で見つからないことです。できることは、修飾名を導入し、それを相互参照で使用して、それに応じて文法を変更することです。つまり、-

QualifiedName:
    ID ('.' ID)*;

Relationship:
    name=ID ":" newEntityName=ID "->" refName=[Attribute|QualifiedName];

これで、修飾 ID を使用して参照できるようになります。

ENTITY_RELATIONSHIP {
    auction_lots : lot_id -> auctionHouse.lots.id0
    auction_lots : auction_id -> auctionHouse.auctions.id1
}

このように文法を変更して Xtext が名前を処理するデフォルトの方法を利用できない場合は、独自の修飾名を提供することを検討する必要があります。そのための優れた記事は、修飾名の記事です。

于 2013-01-30T13:15:13.830 に答える