通过递归下降解析创建一个cons单元结构

时间:2015-04-25 00:55:26

标签: c parsing recursion scheme recursive-descent

我目前正在研究一个用C语言编写的Scheme Interpreter。我试图通过递归下降解析来创建一个cons单元结构,除了不仅仅有汽车和缺点,我还有一个字段保存我从词法分析器(提供给我们)收到的令牌。我所描述的struct就是这样:

typdef struct node node;

typedef node* list;

struct node { 
    char* symbol;
    list car;
    list cdr;
};

因此,cons小区(节点表示为[symbol][car][cdr]),[null][car][cdr],而符号将为[symbol][null][null]

例如,(a b c)将表示为: enter image description here

(a (b c) d)将表示为: enter image description here

关于堆栈溢出的上一篇文章:Cons Cell data structure in C几乎处理相同的赋值。在杰森对该帖子的最佳答案中,他的一个建议是将令牌放入堆栈,因为输入是递归解析的,然后从该堆栈输入到cons单元结构中。

这是我现在正在努力的事情,因为我更容易理解并且我之前已经在C中实现了堆栈,但我知道我可以递归地构建结构,我&#39 ;我只是不确定如何。以下是我的伪代码:

list s_expression() {
    list local;
    list temp;

    if (token == "(") {
        token = getToken();
        local = new node;
        local -> car = s_expression()
        temp = local;

        while (token != ")") {
            temp -> rest = new node;
            temp = temp -> rest;
            temp -> first = s_expression()
        }

        temp -> rest = NULL;
        token = getToken();
    } else if (token == symbol) {
        list symbolNode = new node;
        symbolNode -> symbol = token;
        token = getToken()
        return symbolNode;
    } else {
        return local;
    }
}

s_expression应该返回指向递归构建的cons单元结构的指针。我在确定何时拨打getToken()时遇到问题,因为我在错误的地方拨打getToken并无意中跳过了令牌,或者在我和#时呼叫getToken() 39;我完成了获取所有令牌,从而导致我的程序继续从用户输入中搜索令牌,而不是继续执行其余程序。

我应该何时致电getToken()

此外,当您浏览用户的输入时,递归构建cons单元结构,或者将所有标记放入堆栈然后使用该堆栈构建cons单元结构会更好? / p>

如果需要,我可以发布已经提供给我们的词法分析器。

1 个答案:

答案 0 :(得分:0)

我在想,如果您阅读的第一件事是符号,那么就没有其他令牌,因此符号读取不应该获得新的令牌。读完列表后也是如此。

当令牌是“(”并且读取符号或表达式之后,您将不会有新的令牌。因此,在此之前的谓词之前,您需要读取新令牌,因为您知道您正在搜索结束这意味着在你进入while循环之前和你在体内阅读s_expression之后。

其他观察

谓词token == symbol似乎很奇怪。你只允许使用相同的符号吗?除了列表和符号之外还有其他数据类型可以证明不仅仅是else吗?

最后else(替代)从未被击中。因此,在阅读列表时,您永远不会返回任