返回介绍

3.9 插入输出

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

也许对于处理算术表达式的突出点是带小括号的形式打印。这通常是有点滑稽的,依照谁来负责发出括号。此外对于操作符的名字用于前缀输出,我们增加了两个数值到 struct Type 中。

struct Type {
  const char * name; /* node’s name */
  char rank, rpar;
  void * (* new) (va_list ap);
  void (* exec) (const void * tree, int rank, int par);
  void (* delete) (void * tree);
};

.rank 是优先的操作符,以 1 开始,此外 .rpar 被设置用于操作符,如减操作,此操作如果用于相等的优先级的操作就要求他们的右操作被附上括号。

$ infix
1 + (2 — 3)
1 + 2 — 3
1 — (2 — 3)
1 — (2 — 3)

这个证实了我们需要如下的初始化:

static struct Type _Add = {"+", 1, 0, mkBin, doBin, freeBin};
static struct Type _Sub = {"—", 1, 1, mkBin, doBin, freeBin};

滑稽的部分是对于二元节点得去决定它是否必须要增加括号。一个二元节点如加法,被给予它自己较高的优先级并且一个标记指示在相等的优先级中括号是否是必须的。 doBin() 去判别是否使用括号:

static void doBin (const void * tree, int rank, int par)
{
  const struct Type * type = * (struct Type **) tree;
  par = type —> rank < rank
  || (par && type —> rank == rank);
  if (par)
  putchar(’(’);
  exec(((struct Bin *) tree) —> left, type —> rank, 0);
  printf(" %s ", type —> name);
  exec(((struct Bin *) tree) —> right,
  type —> rank, type —> rpar);
  if (par)
  putchar(’)’);
}

与高优先级的操作符比若我们有一个较低优先级,或者如果我们被要求在相等的优先级情况下输出括号,我们就打印括号。在任何情况下,如果我们的描述有 .rpar 的设置,我们要求仅仅我们的所有操作输出额外的括号如上:

保持打印的实例程序是较容易写的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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