这就是我想要解析的内容
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
非常感谢任何有关如何正确执行此操作的建议,评论,代码或提示。
答案 0 :(得分:1)
您应该在验证程序中强制执行正确数量的类型参数。通常情况下,拥有宽松的范围提供程序和严格的验证程序可以提供更好的错误消息。