仿查询分析器的C#计算器——5.计算求值

代码下载https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar

前面几篇文章介绍了各种分析过程,本篇作为完结篇,介绍如何调用之前实现的代码,如何实现多行表达式或者选择部分表达式进行运算,以及如何定位错误。

本程序可以不需要UI界面,独立成一个模块。如果表达式分析与计算功能打包成一个dll,那入口只有一个,SyntaxAnalyse类。new一个SyntaxAnalyse类之后,调用其中的Analyse方法,将要计算的运算表达式作为参数传递进去,返回一个顶级TokenRecord对象,再根据返回的TokenRecord对象的值类型取得结果,整个计算过程就完成了,使用起来非常方便。

Code

从代码中可以看出,首先是词法分析,得到一个记号对象列表List<TokenRecord>,然后进行语法分析,调用SyntaxTreeAnalyse的SnytaxTreeGetTopTokenAnalyse方法,分析出顶级记号对象,这样一棵树就出来了。接下来执行顶级节点的Execute方法,该方法中首先会执行下级节点的Execute方法,然后再针对下级节点的值执行自身的运算。所有的TokenRecord都是这样的模式,逐级递归调用,最后得到计算结果。TokenRecord基类中包含一个object类型的Value属性和一个Type类型的TokenValueType属性,通过这两个属性可以得到具体的值及其类型,然后做下一步处理。因为这里不只能执行数学运算,还能做字符串和逻辑值运算,所以必须通过TokenValueType来确定值的类型。如果只需要实现数学运算,程序会简单一些。

窗体的调用也很简单,并没有设计漂亮的外观和高级设置等。主要的代码是“计算”按钮的Click事件处理方法,代码如下:

Code


代码中包含详细的注释,这里做简要说明。未选中输入框中的文本则执行全部代码,否则执行选中部分的代码。将要执行的代码根据是否计算多行进行分解,存放在一个字符串数组中。然后对表达式数组循环计算。如此实现了选择部分表达式计算以及多行表达式计算。另外如何实现错误定位,则是通过捕获错误。程序中定义了一个Exception类,但进行词法分析和语法分析的时候,如果发生错误,则会抛出该异常。通过该异常类中的错误序号以及长度,就可以选中输入框中的错误部分。但是这里只能选中第一次发生的错误,不能像VS.NET的IDE一样捕获所有错误。Exception类的定义如下:

Code

单行多行切换只需要设置窗体的AcceptButton属性为“计算按钮”即可,这样在单行状态下,用户回车就相当于点击“计算按钮”。而按“F5”键执行计算则是通过检测输入框的KeyUp事件,当释放“F5”键时用代码去执行“计算”按钮的Click操作实现计算。

另外这里有一个语法树分析,是为了显示语法树的结构,用更直观的方法来验证分析是否正确。树节点的文本是调用TokenRecord的ToString方法得到的,如果需要显示为其他信息,也可以自行修改。

到这里本系列文章就结束了,其中包含了一些编程的技巧,希望对看了本系列文章的各位有帮助。
输入界面
语法树分析
代码下载https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar

原文地址:https://www.cnblogs.com/conexpress/p/MyCalculator_05.html