【发布时间】:2012-02-24 17:38:57
【问题描述】:
我正在寻找一种方法来实现 S 表达式阅读器(稍后将与 Scheme 解释器和编译器一起使用),但我一直在问自己应该如何(如果有的话)编写 AST为它。
我一直在阅读 SICP,这在 Scheme 中非常简单,但我希望以 OO 方式在 C++ 中实现解释器和编译器。
请记住,我这样做只是为了学习目的,所以我并不是在寻找最简单或最快的方法,而是在寻找正确且可重复使用的方法。
我在一些 Scheme 实现中看到人们解析 s 表达式并轻松输出 cons 单元格,如下所示:
struct Sexpr
{
};
struct Cons : public Sexpr
{
Sexpr* left;
Sexpr* right;
};
struct IntAtom : Sexpr
{
int value;
};
对于每一种 Scheme Atom 或类似的东西都有一个 Sexpr 子类。
我不确定,但这对我来说似乎是一个 hack……这项工作不应该由口译员而不是读者来完成吗?
我想知道的是,这是否被认为是阅读 S 表达式的最佳(或正确)方式,或者这更像是解释器而不是解析器的工作?解析器是否应该有自己的 AST 而不是依赖 cons 单元?
【问题讨论】:
-
如果我没看错,这个问题与解析没有太大关系。相反,我认为您在问:对于 s-expression 数据类型,最合适的表示是什么。你同意吗?
-
@dyoo 是也不是。是的,你是对的,我正在寻找最适合 s 表达式的表示。不,你错了,这个问题显然与解析有关。如果我只是为 sexpr 寻找最合适的表示,那么毫无疑问它将是 cons 细胞。但是,我正在寻找最合适的 sexpr 表示,特别是用于解析。
-
酷。很好的澄清。然后:可能区分解析任务的一件事是需要源位置信息。普通的 cons 细胞不记得它们在原始来源中的来源。在解析期间,您可能希望支持可以指向源的错误消息。我们还需要什么其他东西来解析?
-
@dyoo 不是这样。我在这里要区分的是
cons cells是一个运行时结构。它是语言的语义部分,而不是句法部分。由于我希望完全分离编译/解释阶段,我不希望我的解析器处理语义内容。 -
@dyoo 虽然我应该补充一点,对于 Lisps 来说,将它们分开的线似乎很模糊,所以我可能推得太多了。
标签: c++ oop scheme abstract-syntax-tree s-expression