返回介绍

3.5 信息隐藏

发布于 2025-02-24 22:44:37 字数 1543 浏览 0 评论 0 收藏 0

应用迄今为止我们学到的,我们绝不去揭示节点结构。相反,我们先在头文件 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文