我目前正在研究一个用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)
将表示为:
而(a (b c) d)
将表示为:
关于堆栈溢出的上一篇文章: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>
如果需要,我可以发布已经提供给我们的词法分析器。
答案 0 :(得分:0)
我在想,如果您阅读的第一件事是符号,那么就没有其他令牌,因此符号读取不应该获得新的令牌。读完列表后也是如此。
当令牌是“(”并且读取符号或表达式之后,您将不会有新的令牌。因此,在此之前的谓词之前,您需要读取新令牌,因为您知道您正在搜索结束这意味着在你进入while循环之前和你在体内阅读s_expression
之后。
其他观察
谓词token == symbol
似乎很奇怪。你只允许使用相同的符号吗?除了列表和符号之外还有其他数据类型可以证明不仅仅是else
吗?
最后else
(替代)从未被击中。因此,在阅读列表时,您永远不会返回任