2014-09-24 72 views
3

我知道它是可以构建生成的函数里面的类型,但有可能返回超出他们吗?是否可以使用scala宏来构造类型?

我需要产生一个宏解析器[T] - 其中两个解析器和T自外部语法构造,写在用于图书馆用户简化语法描述语言。 T被解析的AST包含相互嵌套的case类。这些案例类应该在外面生成并且可见。

语法:

RootType { 
    member1: { 
    member11: TypeB 
    member12: String 
    member13: TypeB 
    } 
    member2: String 
    TypeB { 
    member3: String 
    } 
} 

用途:

//Somewhere in my library: 
trait ASTNode 
def parser: Parser[ASTNode] = macro ... //interpret types from grammar-file 

//On the client side: 
val input = ... //reads unparsed string from some script-file 
val parsed = parse(parser, input) 
parsed.member1.member11.member3 //so ASTNode should be replaced with RootType 
//case class TypeB and synthetic case class for member1 should be also generated 

我正在考虑的解决方案:

  • 黑盒宏(如何定义可能产生的外部使用类型功能)
  • 解决方法:宏观注解的类型白衣h成员从我的语法生成(我不知道我有多少类型,所以我需要通过注释生成子类,有可能吗?)
  • 编写编译器插件或单独的sbt任务或查看macroparadise
  • 在运行时生成类是不是一种选择,因为我需要检查类型

回答

2

是的,这是可能的。您可以生成的AST包括ClassDefModuleDef等没有问题,如果你使用的宏注释(从宏观的天堂),他们将外部代码可见(在正常def宏象parser在您需要的代码,他们是本地的) 。请参阅http://docs.scala-lang.org/overviews/macros/typeproviders.htmlhttps://github.com/travisbrown/type-provider-examples中的“公共类型提供者”。您的图书馆代码看起来会略有不同:

@Grammar("path/to/file") trait ASTNode // reads grammar, and generates subclasses, parser, etc. 
+0

已尝试。感谢您输入供应商的链接! – dk14 2014-09-24 05:15:05

相关问题