文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.5 信息隐藏
应用迄今为止我们学到的,我们绝不去揭示节点结构。相反,我们先在头文件 value.h
中放置一些声明如下:
const void * Add;
…
void * new (const void * type, ...);
void process (const void * tree);
void delete (void * tree);
现在我们可以编写代码 sum()
如下:
#include "value.h"
static void * sum (void)
{
void * result = product();
const void * type;
for (;;)
{
switch (token) {
case '+':
type = Add;
break;
case '-':
type = Sub;
break;
default:
return result;
}
scan(0);
result = new(type, result, product());
}
}
product()
与 sum()
有相同的结构,并且调用 一个函数 factor()
去识别数字,符号,且 sum
被赋予了括号:
static void * factor (void)
{
void * result;
switch (token) {
case '+':
scan(0);
return factor();
case '-':
scan(0);
return new(Minus, factor());
default:
error("bad factor: '%c' 0x%x", token, token);
case NUMBER:
result = new(Value, number);
break;
case '(':
scan(0);
result = sum();
if (token != ')')
error("expecting )");
}
scan(0);
return result;
}
尤其在 factor()
中,我们需要特别小心的保持扫描器(scanner)是不变的: token
必须总是包含下一个输入的符号。一旦 token
被使用,我们需要调用 scan(0)
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论