WEB开发网
开发学院软件开发C语言 用 C# 设计与实现一个算术运算解释器 2 阅读

用 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

用 C# 设计与实现一个算术运算解释器 2

对于一元运算符而言,它的子树会放在右边,而不是左边。

同时也需要考虑到意外情况,比如对于表达式 - - 1,试图插入一个一元运算符到一个根已经是一元运算符的树中,就应该抛出错误。

除此之外,不需要做其他代码的更改!因为原有的代码在处理插入的情况已经非常好了。

整个树的结构,总是保证优先权最高的运算符在最深的叶上。根总是优先权最低的运算符。

因为一元运算符的优先权比二元运算符要高,所有它们能够被正确的插入树中正确的位置。

其他需要修改的是在解释的过程中,需要考虑到一元运算符,修改的代码如下:

上一页  1 2 3 4 5 6  下一页

Tags:设计 实现 一个

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接