我正在学习ANTLR4,并尝试构建一个简单的DSL(特定于领域的语言),因为我的应用程序的后端是用Java开发的,目的是解析DSL并用Java后端运行。我的DSL是Java和GOSE这样的简化版本:
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());
这些将不起作用,因为泛型是编译的东西,类型a只能在运行时确定,即使我使用对象作为泛型类型t,我仍然需要在某个时刻将值强制转换为类型a,一般来说,处理这个问题的正确方法是什么?