如何让Antlr支持更多数据类型的符号表?

时间:2014-04-28 08:53:21

标签: java antlr

我已经研究了问题15588452以了解如何构建符号表。

我的问题是如何使符号表支持更多数据类型的实现细节,

我不想只支持整数:

memory = new HashMap<String, Integer>();

据我所知(原谅我,我还没有完成关于编译器的整本龙书),有以下两种方式。

第一种方式:构建包含Symbol对象的地图:

Map<String, Symbol> symbolMap = new LinkedHashMap<String, Symbol>();

Symbol对象的名称,类型,数据块信息如下:

public class Symbol {
    protected Scope scope; // scope info
    protected String name;
    protected ValueType type;//contains type info ,like int float
    protected Object  value;//contains the real value
}

当解析它的值时,我们可以进行类型转换,强制转换为它需要的类型:

float a = (float)symbol.value;//convert object field to float

这将导致大量if..else类型检查。

或者我们计算内存大小并解析内存块。

第二种方式:使用包含不同类型数据的更多地图,如下所示:

Map<String, Integer> intMap = new LinkedHashMap<String, Integer>();

Map<String, Double> doubleMap = new LinkedHashMap<String, Double>();

int a = 5;//put in intMap

double b = 1.34;//put in doubleMap

我们将它放在不同的地图中以及我们解决它,这看起来有点愚蠢。

如何以温和的方式支持更多类型?

任何有经验的人,请提供一些见解,谢谢。

1 个答案:

答案 0 :(得分:1)

更具体地说,您需要的不仅仅是符号表。您希望能够在运行时存储与这些符号关联的值。对于这样的翻译,人们倾向于使类型化的记忆单元类似于你的第一种方式。通常,符号具有数据类型指针,然后,如果在解释器中,则具有对数据的引用。你在当前范围内查找它,然后它向上移动范围树,直到它找到第一个符号,然后简单地获取它的值。