0

这就是我想要解析的

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 

任何有关如何正确执行此操作的建议、评论、代码或提示将不胜感激。

4

1 回答 1

1

您应该在验证器中强制执行正确数量的类型参数。通常最好有一个自由范围提供者和一个严格的验证者来提供更好的错误消息。

于 2012-01-22T11:17:39.343 回答