转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
表达式编译计算器(上)         ★★★★

表达式编译计算器(上)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:734 更新时间:2009/4/23 18:58:37
表达式编译计算器(上)

Ken J  VB 加油站

概述

由于某种原因, 近日编写了一个使用编译原理实现的表达式计算器。 使用该程序可以不但可以计算普通的数字和字符串表达式, 而且支持一些VB 的常用函数及极好的可扩展性。 例如:
  录入字符串: len("1234") + 10/2 结果: 9
  录入字符串: mid("1234",2) & cstr(10/2)  结果: 2345

在该程序的设计中, 使用了编译的基本概念。所以可以极其方便得加入新的语法, 一个可能的例子就是实现宏替换, 作为一个演示, 我在该类中也提供了一个宏替换的接口。

语法

编译说穿了是对一个数据流进行逐字的分析, 把分析过程看做是不断的读取数据, 是实现程序的一个基本思想。现在让我们自顶而下地对表达式进行分析, 该语法图如下:

flow.jpg (39477 字节)

注意: 其中宏替换的字符是在键盘左上角和 ~ 一起的那个。完整的语法图应该还包括其他几个定义, 没有在上图表现出来。

只要理解了语法, 实现就方便了。

实现

表达式

作为一个语法实现的例子, 下面是实现表达式定义的函数:
Public Function GetExp(Str1 As String) As String
Dim Val1, Val2, Op1, Op2, Val3
Dim NewVal
Val1 = GetValue(Str1) '''' 得到一个值
NewVal = Val1
Op1 = ReadOp(Str1) '''' 取下一个操作字符
Do While Op1 <> "" '''' 直到没有任何操作符才结束
Val2 = GetValue(Str1) '''' 取操作符后面的值
Op2 = ReadOp(Str1) '''' 取下一个操作符, 目的是实现 * / 的优先操作。
Do While Op2 <> ""
If (Op2 = "*" Or Op2 = "/") And (Op1 = "-" Or Op1 = "+") Then
Val3 = GetValue(Str1)
Val2 = CompStr(Val2, Op2, Val3) ''''CompStr 函数完成计算操作
Op2 = ReadOp(Str1)
Else
Exit Do
End If
Loop
NewVal = CompStr(NewVal, Op1, Val2)
Op1 = Op2
Loop
GetExp = NewVal '''' 返回计算结果
End Function

Private Function GetValue(Str1 As String) As String
Dim C1 As String
C1 = ReadChar(Str1) ''''取一个字符
Do While C1 = " " And C1 <> ""
C1 = ReadChar(Str1) ''''去掉空格
Loop
Select Case C1
Case """" '''' 如果是", 认为是一个字符串
GetValue = ReadString(Str1) ''''读入一个字符串
CurType = "string" '''' 为以后的类型检查准备
Case "("
GetValue = GetExp(Str1) '''' 如果是括号中的话, 认为是另一个表达式
C1 = ReadChar(Str1) ''''下面的代码是检查括号匹配
Do While C1 <> "" And C1 = " "
C1 = ReadChar(Str1)
Loop
If C1 <> ")" Then ErrorStr = "需要 )"
Case "0" To "9"
GetValue = C1 & ReadNumber(Str1) ''''读如数字串
CurType = "number"
Case "`"
GetValue = ReadField(Str1) '''' 进行宏处理
Case Else
RetChar Str1, C1 ''''如果是其他, 把该字符退回
GetValue = ReadFunction(Str1) ''''进入函数处理程序
End Select
End Function

两个基本的函数

下面的两个函数实现了最基本的从表达式中取一个字符或退回一个字符。

'''' ReadChar: 取出一个字符,
'''' 参数: Str1 要处理的表达式字符串
'''' 返回: 第一个字符
'''' Str1 成为被取后的字符串
Private Function ReadChar(Str1 As String) As String
ReadChar = ""
If Str1 = "" Then Exit Function
ReadChar = Left(Str1, 1)
Str1 = Right(Str1, Len(Str1) - 1)
End Function

'''' RetChar退回一个字符
'''' 参数: Str1 处理的字符串
'''' AChar 要退回的字符
'''' 返回: Str1 :被退回的字符串
Private Function RetChar(Str1 As String, AChar As String) As String
Str1 = AChar & Str1
RetChar = Str1
End Function

数字

'''' 读入数字
'''' 参数: Str1 处理的字符串
'''' 返回: 取到的数字, "" 为错误!
'''' Str1 :处理后字符串
Private Function ReadNumber(Str1 As String) As String
Dim C1 As String
Dim rets As String
rets = ""
C1 = ReadChar(Str1)
Do While C1 <> ""
If C1 >= "0" And C1 <= "9" Then
rets = rets & C1
Else
RetChar Str1, C1
Exit Do
End If
C1 = ReadChar(Str1)
Loop
ReadNumber = rets
End Function

To Be Continue...


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台