2012-01-22 5 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), и в идеале арктичность аргументов типа будет принудительно применена.

И, конечно, если что-то объявлено не универсальным типом (например, 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

Как насчет с точки зрения завершения кода? Когда кто-то вводит общий тип, я хочу, чтобы редактор знал, что им нужно вводить аргументы типа. Подобно этому не следует предлагать «парную» как таковую, она должна предлагать «Пара [T, V]» – Heptic

+0

Вы должны настроить поддержку контента для этой цели (например, путем предоставления значимых значений для T, V, включая заполнителей после применения предложения) , –

Смежные вопросы