文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.9 插入输出
也许对于处理算术表达式的突出点是带小括号的形式打印。这通常是有点滑稽的,依照谁来负责发出括号。此外对于操作符的名字用于前缀输出,我们增加了两个数值到 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 技术交流群。

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