2012-01-22 146 views
0

此建立交叉引用的是我想要什麼,我試圖解析XTEXT一個泛型類型

type Number(); // define a type called "Number" with no member variables 
type Point(Number x, Number y); // define a type called Point with member variables 

// and something with generic types 
type Pair[T, V](T first, V second); 

// and even something cyclic: 
type LinkedList[T](T payload, LinkedList[T] rest); 

這是我的XTEXT語法,允許其:

TypeDecl returns SSType: 
    'type' name=TypeName 
    ('[' typeParams += TypeName (',' typeParams += TypeName)* ']')? 
    '(' (args += Arg (',' args += Arg)*)? ')' ';' 
; 

TypeName returns SSTypeName: 
    name=ID 
; 

Type: 
    tn = [SSTypeName] ('[' typeParams += Type (',' typeParams += Type)* ']')? 
; 


Arg: 
    type = Type argName = ID 
; 

其中一期工程,但在接受的方面過於自由。如果有東西被聲明爲一個通用的(例如上面例子中的LinkedList),它應該只能用作通用的(例如LinkedList[Number]而不是LinkedList),理想情況下類型參數的arity將被強制執行。

當然,如果某些東西被聲明爲不是泛型類型(例如Number),那麼給它的類型參數應該是無效的。東西

例如,它會錯誤地接受:

type Wrong1(Number[Blah] a); // number doesn't have type arguments 
type Wrong2(Pair a); // Pair has type arguments 
type Wrong3(Pair[Number, Number, Number] a); // wrong arity 

任何建議,意見,就如何做到這一點正確的代碼或提示將不勝感激。

回答

1

您應該在驗證器中強制執行正確數量的類型參數。通常有一個自由的範圍提供者和一個嚴格的驗證者來提供更好的錯誤信息通常會更好。

+0

從代碼完成的角度來看呢?當某人鍵入一個泛型類型時,我希望編輯器知道他們必須輸入類型參數。就像它不應該建議「Pair」一樣,它應該建議「Pair [T,V]」 – Heptic

+0

您必須爲此目的自定義內容幫助(例如,在應用提議之後,爲T,V包括佔位符提供有意義的值) 。 –