VB字符串表达式计算函数.

      这是一个VB6.0的字符串表达式计算函数.

 

  1. Private Function EvaluateExpr(ByVal expr As StringAs Single
  2.        Const PREC_NONE = 11
  3.        Const PREC_UNARY = 10
  4.        Const PREC_POWER = 9
  5.        Const PREC_TIMES = 8
  6.        Const PREC_DIV = 7
  7.        Const PREC_INT_DIV = 6
  8.        Const PREC_MOD = 5
  9.        Const PREC_PLUS = 4
  10.        Dim is_unary   As Boolean
  11.        Dim next_unary   As Boolean
  12.        Dim parens   As Integer
  13.        Dim pos   As Integer
  14.        Dim expr_len   As Integer
  15.        Dim ch   As String
  16.        Dim lexpr   As String
  17.        Dim rexpr   As String
  18.        Dim value   As String
  19.        Dim status   As Long
  20.        Dim best_pos   As Integer
  21.        Dim best_prec   As Integer
  22.        '  Remove  leading  and  trailing  blanks.
  23.        expr = Trim$(expr)
  24.        expr_len = Len(expr)
  25.        If expr_len = 0 Then Exit Function
  26.        '  If  we  find  +  or  -  now,  it  is  a  unary  operator.
  27.        is_unary = True
  28.        '  So  far  we  have  nothing.
  29.        best_prec = PREC_NONE
  30.        '  Find  the  operator  with  the  lowest  precedence.
  31.        '  Look  for  places  where  there  are  no  open
  32.        '  parentheses.
  33.        For pos = 1 To expr_len
  34.                '  Examine  the  next  character.
  35.                ch = Mid$(expr, pos, 1)
  36.                '  Assume  we  will  not  find  an  operator.  In
  37.                '  that  case  the  next  operator  will  not
  38.                '  be  unary.
  39.                next_unary = False
  40.                If ch = "  " Then
  41.                        '  Just  skip  spaces.
  42.                        next_unary = is_unary
  43.                ElseIf ch = "(" Then
  44.                        '  Increase  the  open  parentheses  count.
  45.                        parens = parens + 1
  46.                        '  An  operator  after  "("  is  unary.
  47.                        next_unary = True
  48.                ElseIf ch = ")" Then
  49.                        '  Decrease  the  open  parentheses  count.
  50.                        parens = parens - 1
  51.                        '  An  operator  after  ")"  is  not  unary.
  52.                        next_unary = False
  53.                        '  If  parens  <  0,  too  many  ')'s.
  54.                        If parens < 0 Then
  55.                                Err.Raise vbObjectError + 1001, _
  56.                                        "EvaluateExpr", _
  57.                                        "Too  many  )s  in  '" & _
  58.                                        expr & "'"
  59.                        End If
  60.                ElseIf parens = 0 Then
  61.                        '  See  if  this  is  an  operator.
  62.                        If ch = "^" Or ch = "*" Or _
  63.                              ch = "/" Or ch = "/" Or _
  64.                              ch = "%" Or ch = "+" Or _
  65.                              ch = "-" _
  66.                        Then
  67.                                '  An  operator  after  an  operator
  68.                                '  is  unary.
  69.                                next_unary = True
  70.                                  
  71.                                Select Case ch
  72.                                        Case "^"
  73.                                                If best_prec >= PREC_POWER Then
  74.                                                        best_prec = PREC_POWER
  75.                                                        best_pos = pos
  76.                                                End If
  77.                                          
  78.                                        Case "*""/"
  79.                                                If best_prec >= PREC_TIMES Then
  80.                                                        best_prec = PREC_TIMES
  81.                                                        best_pos = pos
  82.                                                End If
  83.                                          
  84.                                        Case "/"
  85.                                                If best_prec >= PREC_INT_DIV Then
  86.                                                        best_prec = PREC_INT_DIV
  87.                                                        best_pos = pos
  88.                                                End If
  89.                                          
  90.                                        Case "%"
  91.                                                If best_prec >= PREC_MOD Then
  92.                                                        best_prec = PREC_MOD
  93.                                                        best_pos = pos
  94.                                                End If
  95.                                          
  96.                                        Case "+""-"
  97.                                                '  Ignore  unary  operators
  98.                                                '  for  now.
  99.                                                If (Not is_unary) And _
  100.                                                        best_prec >= PREC_PLUS _
  101.                                                Then
  102.                                                        best_prec = PREC_PLUS
  103.                                                        best_pos = pos
  104.                                                End If
  105.                                End Select
  106.                        End If
  107.                End If
  108.                is_unary = next_unary
  109.        Next pos
  110.          
  111.        '  If  the  parentheses  count  is  not  zero,
  112.        '  there's  a  ')'  missing.
  113.        If parens <> 0 Then
  114.                Err.Raise vbObjectError + 1002, _
  115.                        "EvaluateExpr""Missing  )  in  '" & _
  116.                        expr & "'"
  117.        End If
  118.          
  119.        '  Hopefully  we  have  the  operator.
  120.        If best_prec < PREC_NONE Then
  121.                lexpr = Left$(expr, best_pos - 1)
  122.                rexpr = Right$(expr, expr_len - best_pos)
  123.                Select Case Mid$(expr, best_pos, 1)
  124.                        Case "^"
  125.                                EvaluateExpr = _
  126.                                        EvaluateExpr(lexpr) ^ _
  127.                                        EvaluateExpr(rexpr)
  128.                        Case "*"
  129.                                EvaluateExpr = _
  130.                                        EvaluateExpr(lexpr) * _
  131.                                        EvaluateExpr(rexpr)
  132.                        Case "/"
  133.                                EvaluateExpr = _
  134.                                        EvaluateExpr(lexpr) / _
  135.                                        EvaluateExpr(rexpr)
  136.                        Case "/"
  137.                                EvaluateExpr = _
  138.                                        EvaluateExpr(lexpr) / _
  139.                                        EvaluateExpr(rexpr)
  140.                        Case "%"
  141.                                EvaluateExpr = _
  142.                                        EvaluateExpr(lexpr) Mod _
  143.                                        EvaluateExpr(rexpr)
  144.                        Case "+"
  145.                                EvaluateExpr = _
  146.                                        EvaluateExpr(lexpr) + _
  147.                                        EvaluateExpr(rexpr)
  148.                        Case "-"
  149.                                EvaluateExpr = _
  150.                                        EvaluateExpr(lexpr) - _
  151.                                        EvaluateExpr(rexpr)
  152.                End Select
  153.                Exit Function
  154.        End If
  155.          
  156.        '  If  we  do  not  yet  have  an  operator,  there
  157.        '  are  several  possibilities:
  158.        '
  159.        '  1.  expr  is  (expr2)  for  some  expr2.
  160.        '  2.  expr  is  -expr2  or  +expr2  for  some  expr2.
  161.        '  3.  expr  is  Fun(expr2)  for  a  function  Fun.
  162.        '  4.  expr  is  a  primitive.
  163.        '  5.  It's  a  literal  like  "3.14159".
  164.          
  165.        '  Look  for  (expr2).
  166.        If Left$(expr, 1) = "(" And Right$(expr, 1) = ")" Then
  167.                '  Remove  the  parentheses.
  168.                EvaluateExpr = EvaluateExpr(Mid$(expr, 2, expr_len - 2))
  169.                Exit Function
  170.        End If
  171.                  
  172.        '  Look  for  -expr2.
  173.        If Left$(expr, 1) = "-" Then
  174.                EvaluateExpr = -EvaluateExpr( _
  175.                        Right$(expr, expr_len - 1))
  176.                Exit Function
  177.        End If
  178.          
  179.        '  Look  for  +expr2.
  180.        If Left$(expr, 1) = "+" Then
  181.                EvaluateExpr = EvaluateExpr( _
  182.                        Right$(expr, expr_len - 1))
  183.                Exit Function
  184.        End If
  185.          
  186.        '  Look  for  Fun(expr2).
  187.        If expr_len > 5 And Right$(expr, 1) = ")" Then
  188.                lexpr = LCase$(Left$(expr, 4))
  189.                rexpr = Mid$(expr, 5, expr_len - 5)
  190.                Select Case lexpr
  191.                        Case "sin("
  192.                                EvaluateExpr = Sin(EvaluateExpr(rexpr))
  193.                                Exit Function
  194.                        Case "cos("
  195.                                EvaluateExpr = Cos(EvaluateExpr(rexpr))
  196.                                Exit Function
  197.                        Case "tan("
  198.                                EvaluateExpr = Tan(EvaluateExpr(rexpr))
  199.                                Exit Function
  200.                        Case "sqr("
  201.                                EvaluateExpr = Sqr(EvaluateExpr(rexpr))
  202.                                Exit Function
  203.                End Select
  204.        End If
  205.          
  206.        On Error Resume Next
  207.        EvaluateExpr = CSng(expr)
  208.        status = Err.Number
  209.        On Error GoTo 0
  210.        If status <> 0 Then
  211.                Err.Raise status, _
  212.                        "EvaluateExpr", _
  213.                        "Error  evaluating  '" & expr & _
  214.                        "'  as  a  constant."
  215.        End If
  216. End Function
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值