我正在学习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,正确的方法是一般处理这个?
答案 0 :(得分:4)
如果要允许任意类型,这是一项艰巨的任务。您需要一个Type System,它负责处理DSL中的每种可能的类型。您不能为此使用泛型(如您所知),而必须在类型系统中提供允许在表达式中使用特定类型的类。他们将检查类型(名称,值域)的有效性,并执行可能的操作,隐式/显式转换为其他类型等。