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

如何在Java解析器中处理类型?,java,parsing,antlr4,Java,Parsing,Antlr4,我正在学习antlr4并试图构建一个简单的DSL(领域特定语言),因为我的应用程序的后端是用Java开发的,目标是解析DSL并使用Java后端运行。我的DSL是Java和gose的简化版本,如下所示: typeA a = expression; 语法和词法是基于。 这就像用Java实现Java一样。现在我遇到的问题是解析语句,比如typeA=expression变量a的类型仅在运行时已知,可以是任何类型,在解析实现中,我使用类来表示变量、表达式和变量值: Variable{ String

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

typeA a = expression;
语法和词法是基于。 这就像用Java实现Java一样。现在我遇到的问题是解析语句,比如
typeA=expression
变量
a
的类型仅在运行时已知,可以是任何类型,在解析实现中,我使用类来表示变量、表达式和变量值:

Variable{
  String identifier;
  int scopeId;
  //...
}
Value<T>{
  Exprssion<T> expression
  T get(){return expression.evaluate()}
  //...
}
Exprssion<T>{
  T evaluate(){return ...}
  //...
}
变量{
字符串标识符;
int scopeId;
//...
}
价值观{
表达式
T get(){return expression.evaluate()}
//...
}
表达{
T evaluate(){return…}
//...
}
在解析器中,我需要这样的东西

new Expression<TypeA>(); 
new Value<TypeA>(); 
//to represent a assignment: 
Value<TypeA> va; ... va.set(vb.get());
newexpression();
新值();
//代表任务:
值va。。。va.set(vb.get());

这些将不起作用,因为泛型是编译的东西,TypeA只能在运行时确定,即使我使用Object作为泛型类型T,我仍然需要在某个时候将值转换为TypeA,一般来说,正确的处理方法是什么

如果您想允许任意类型,这是一项非常重要的任务。您需要的是一个服务器,它负责处理DSL中的每种可能类型。您不能为此使用泛型(正如您已经发现的那样),但必须在类型系统中提供允许在表达式中使用特定类型的类。他们将检查类型(名称、值域)的有效性,并执行可能的操作、到其他类型的隐式/显式转换等。

如果您希望允许任意类型,这是一项非常重要的任务。您需要的是一个服务器,它负责处理DSL中的每种可能类型。您不能为此使用泛型(正如您已经发现的那样),但必须在类型系统中提供允许在表达式中使用特定类型的类。他们将检查类型(名称、值域)的有效性,并执行可能的操作、到其他类型的隐式/显式转换等。

在解析过程中,人们经常尝试做太多的工作,最终得到一个通常不起作用的复杂解决方案。将解析与类型分析分开。确定语法是什么,构建一个解析器来处理它,并构建一个抽象语法树。然后在树上实现一个传递来实现一个符号表,并在传递过程中进行类型分析。人们经常在解析过程中尝试做太多的工作,最终得到一个通常不起作用的复杂解决方案。将解析与类型分析分开。确定语法是什么,构建一个解析器来处理它,并构建一个抽象语法树。然后在树上实现一个传递来实现一个符号表,并在传递过程中进行类型分析。现在,我将仅限于几种类型,以使其易于实现,因为我的DSL非常简单。类型系统确实是我所需要的,我在中找到了Java语言的具体实现。现在,我将仅限于几种类型,以便于实现,因为我的DSL非常简单。