2012-01-22 2 views
0

C'est ce que je veux, je suis en train d'analyserXText établissant des références croisées pour un type générique

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); 

Et voici ma grammaire xtext qui lui permet:

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 
; 

Ce qui fonctionne, mais est trop libéral dans ce qu'il accepte. Si quelque chose est déclaré comme générique (par exemple LinkedList dans l'exemple ci-dessus), il ne devrait être valide que pour l'utiliser comme générique (par exemple LinkedList[Number] et non LinkedList) et idéalement l'arité des arguments de type serait appliquée.

Et bien sûr, si quelque chose est déclaré comme n'étant pas un type générique (par exemple Number), il ne devrait pas être valide pour lui donner des arguments de type.

Exemple de choses il accepte mal:

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 

Toutes les suggestions, commentaires, code ou des conseils sur la façon de le faire correctement seraient très appréciés.

Répondre

1

Vous devez appliquer le nombre correct d'arguments de type dans votre validateur. Il est souvent préférable d'avoir un fournisseur de portée libérale et un validateur strict pour fournir de meilleurs messages d'erreur.

+0

Qu'en est-il du point de vue de l'achèvement du code? Quand quelqu'un tape un type générique, je veux que l'éditeur sache qu'il doit entrer des arguments de type. Comme il ne devrait pas suggérer "Pair" en soi, il devrait suggérer "Pair [T, V]" – Heptic

+0

Vous devez personnaliser le contenu assist à cet effet (par exemple en fournissant des valeurs significatives pour T, V, y compris les espaces réservés après application de la proposition) . –

Questions connexes