【问题标题】:How to make Antlr support a symbol table for more data types?如何让 Antlr 支持更多数据类型的符号表?
【发布时间】:2014-04-28 08:53:21
【问题描述】:

我研究了问题15588452 知道如何构建符号表。

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

我不想只支持整数,例如:

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

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

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

Map<String, Symbol> symbolMap = new LinkedHashMap<String, 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

我们把它放在不同的地图上并解决它,这看起来有点愚蠢。

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

哪位有经验的,请给点见解,谢谢。

【问题讨论】:

    标签: java antlr


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,您给了我一些理论上的帮助!如果在java中实现符号表,如何解析不同数据类型的变量,因为我觉得做太多if..else类型检查在将Object转换为Integer时效率低;如果在c/c++中实现,我们可以使用new或malloc 和其他类型的内存函数来控制内存并根据其大小解析变量。我参考了很多书和网站,他们只是展示了如何设计一个类或接口,但没有包括实现细节,你能给我一些实用指南或有用的参考超链接?
    • 我的书“语言实现模式:创建自己的特定领域和通用编程语言”amzn.com/B00A376HGG 可能会有所帮助。
    • 五小时前偶然得到你的书,虽然半夜得到你的答复,但很高兴你能回答我的问题,谢谢!你的书比龙书对初学者更有帮助,第六、七章有很多实用的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多