如何处理Java解析器中的类型?

时间:2019-01-26 06:16:26

标签: java parsing antlr4

我正在学习antlr4,并尝试构建一种简单的DSL(特定于域的语言),因为我的应用程序的后端是用Java开发的,所以目标是解析DSL并与Java后端一起运行。我的DSL是Java和Java的简化版本,如下所示:

typeA a = expression;

语法和词法分析器基于this。 这就像用Java实现Java。现在我遇到的问题是解析诸如typeA a = expression;之类的语句时,变量a的类型仅在运行时才知道,并且可以是任何类型,在解析实现中,我使用类来表示变量,表达式和变量值:

Variable{
  String identifier;
  int scopeId;
  //...
}
Value<T>{
  Exprssion<T> expression
  T get(){return expression.evaluate()}
  //...
}
Exprssion<T>{
  T evaluate(){return ...}
  //...
}

在解析器中,我需要像这样的东西

new Expression<TypeA>(); 
new Value<TypeA>(); 
//to represent a assignment: 
Value<TypeA> va; ... va.set(vb.get());

这些将无法正常工作,因为泛型是可编译的东西,并且TypeA只能在运行时确定,即使我使用Object作为泛型类型,TI仍然需要在某个时候将值转换为TypeA,正确的方法是一般处理这个?

1 个答案:

答案 0 :(得分:4)

如果要允许任意类型,这是一项艰巨的任务。您需要一个Type System,它负责处理DSL中的每种可能的类型。您不能为此使用泛型(如您所知),而必须在类型系统中提供允许在表达式中使用特定类型的类。他们将检查类型(名称,值域)的有效性,并执行可能的操作,隐式/显式转换为其他类型等。