用 C# 设计与实现一个算术运算解释器 2
2009-05-28 08:28:55 来源:WEB开发网核心提示: 若是截取的字符是 - 或者 + 的话,他们就有可能是一元运算符,用 C# 设计与实现一个算术运算解释器 2(4),也有可能是二元运算符,了解到二元运算符需要 2 个 运算域,所有它们能够被正确的插入树中正确的位置,其他需要修改的是在解释的过程中,那么答案就是,若是上一个截取的单元指令不是一
若是截取的字符是 - 或者 + 的话,他们就有可能是一元运算符,也有可能是二元运算符。了解到二元运算符需要 2 个 运算域,那么答案就是,若是上一个截取的单元指令不是一个运算域的话,那么本字符就是一元运算符。
实现的代码如下:
OpArity arity;
if ((ch == '+' || ch == '-') &&
(list.Count == 0 || (buff.Count == 0 &&
!(list[list.Count - 1] is NumToken)))) {
arity = OpArity.Unary;
} else {
arity = OpArity.Binary;
}
除此之外,在截取单元指令这个部分没有其他大的修改了。主要的修改在下一个部分,创建 AST 树。
三、创建 AST 树
这里要考虑一元运算符对创建树的影响。
考虑最简单情况,-1
对于一元运算符而言,它的子树会放在右边,而不是左边。
同时也需要考虑到意外情况,比如对于表达式 - - 1,试图插入一个一元运算符到一个根已经是一元运算符的树中,就应该抛出错误。
除此之外,不需要做其他代码的更改!因为原有的代码在处理插入的情况已经非常好了。
整个树的结构,总是保证优先权最高的运算符在最深的叶上。根总是优先权最低的运算符。
因为一元运算符的优先权比二元运算符要高,所有它们能够被正确的插入树中正确的位置。
其他需要修改的是在解释的过程中,需要考虑到一元运算符,修改的代码如下:
更多精彩
赞助商链接