如何在Java解析器中处理类型?
我正在学习antlr4并试图构建一个简单的DSL(领域特定语言),因为我的应用程序的后端是用Java开发的,目标是解析DSL并使用Java后端运行。我的DSL是Java和gose的简化版本,如下所示:如何在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
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非常简单。