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

How to deal with type in a Java parser?

我正在学习 antlr4 并尝试构建一个简单的 DSL(领域特定语言),因为我的应用程序的后端是在 Java 中开发的,目标是解析 DSL 和 运行 与 Java 后端。我的 DSL 是 Java 的简化版本,然后像这样:

typeA a = expression;

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

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 作为泛型类型 T,我仍然需要在某些时候将值转换为 TypeA ,一般来说处理这个问题的正确方法是什么?

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