这就是我想要解析的
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
任何有关如何正确执行此操作的建议、评论、代码或提示将不胜感激。