﻿version
6.30
0
Form1
1
1
0
0
0
0
0
0
3
0
0
0
0
0
0
0
0
0
0
0
238
268

1
Bitwise.dll
1
Bitwise.dll
1
bit:Bitwise
Sub designer



addform(Form1,"Form1","",220,220,220)@
addtextbox(form1,tb3,35,195,65,22,"",255,255,255,0,0,0,True,True,False,9)@
addtextbox(form1,tb2,35,155,140,22,"",255,255,255,0,0,0,True,True,False,9)@
addtextbox(form1,tb1,35,30,140,22,"",255,255,255,0,0,0,True,True,False,9)@
addbutton(form1,Button1,70,95,75,23,"Button1",212,208,200,0,0,0,True,True,9)@
End Sub
@EndOfDesignText@Sub Globals
	'Declare the global variables here.
    CurExpPos=-1
	Error_Info=0
	
	BraceErr=1       '括号不匹配
	UnknownOps=2     '未知的运算符
	UnknownFun=4     '未知的函数
End Sub

Sub App_Start
	Form1.Show
	bit.New1
End Sub


Sub read_num(exp,p)
    s=""
	l=StrLength(exp)
	For i=0 To l-p-1
	    t=StrAt(exp,p+i)
		If Not (IsNumber(s&t)) Then Exit
		s=s&t
	Next i
	If s<>"" Then CurExpPos=i-1+p Else CurExpPos=-1
    Return s
End Sub

Sub IsOps(s)
    t=false
	If ((s="+") OR (s="-") OR (s="*") OR (s="/") OR (s="×")  OR (s="^")) OR (s="÷") Then 
		t=true
	End If
	Return t		
End Sub

Sub read_ops(exp,p)
    s=""
	l=StrLength(exp)
	For i=0 To l-p-1
	    t=StrAt(exp,p+i)
		If Not (IsOps(s&t)) Then Exit
		s=s&t
	Next i
	If s<>"" Then CurExpPos=i-1+p Else CurExpPos=-1
    Return s
End Sub

Sub cal(a,op,b)
	If op="+" Then 
		r=a+b
	Else If op="-" Then 
		r=a-b
	Else If (op="*") OR (op="×") Then 
		r=a*b
	Else If (op="/") OR (op="÷") Then 
		r=a/b
	Else If op="^" Then 
		r=a^b
	Else 
		r=0
		Error_Info=bit.OR(Error_Info,UnknownOps)
	End If
	Return r
End Sub

Sub comp_op(a,b)
	r=0
	If (((a="+") OR (a="-")) AND ((b="*") OR (b="/"))) Then r=1
	Return r
End Sub


Sub simpleEvl(exp)
	r=0
	pos_save=CurExpPos
	p=0
	length=StrLength(exp)

	
	a=read_num(exp,p)
	p=CurExpPos
	If p>=0 Then r=a
	
    op1=read_ops(exp,p+1)
	p=CurExpPos
	 	
	If p>=0 Then
		b=read_num(exp,p+1)
		p=CurExpPos		
	End If
	
		Do While (p<=length-1) AND (p>=0) 	
				
			
			op2=read_ops(exp,p+1)
			p=CurExpPos	
			If p<0 Then Exit
			
			c=read_num(exp,p+1)
			p=CurExpPos	
			If p<0 Then Exit
				
			If comp_op(op1,op2)=0 Then 
				a=cal(a,op1,b)
				op1=op2
				b=c
			Else
				b=cal(b,op2,c)
			End If
		Loop
		
	If op1<>"" Then 
		r=cal(a,op1,b) 
	Else
		r=a
	End If
	
	CurExpPos=pos_save
	Return r	
End Sub

Sub fun_detect(s)
	l=StrLength(s)
	i=l-1
	If l=0 Then Return -1
	r=StrAt(s,i)
	
	Do While (IsOps(r)<>true) AND (r<>"(")
		i=i-1
		If i<0 Then Exit
		r=StrAt(s,i)
	Loop

	If i=l-1 Then i=-2
	Return i+1
End Sub

Sub fun(f,p)
	r=0

	If StrCompare(f,"abs",cCaseUnsensitive)=0 Then 
		r=Abs(p)
	Else If StrCompare(f,"sin",cCaseUnsensitive)=0 Then
		r=Sin(p)
	Else If StrCompare(f,"cos",cCaseUnsensitive)=0 Then 
		r=Cos(p)
	Else If StrCompare(f,"tan",cCaseUnsensitive)=0 Then 
		r=Tan(p)
	Else If StrCompare(f,"asin",cCaseUnsensitive)=0 Then 
		r=ASin(p)
	Else If StrCompare(f,"atan",cCaseUnsensitive)=0 Then 
		r=ATan(p)
	Else If StrCompare(f,"acos",cCaseUnsensitive)=0 Then 
		r=ACos(p)
	Else If StrCompare(f,"int",cCaseUnsensitive)=0 Then 
		r=Int(p)
	Else If StrCompare(f,"ln",cCaseUnsensitive)=0 Then 
		r=Ln(p)
	Else If StrCompare(f,"log",cCaseUnsensitive)=0 Then 
		r=Log(p)
	Else If StrCompare(f,"sqrt",cCaseUnsensitive)=0 Then 
		r=Sqrt(p)
	Else
		Error_Info=bit.OR(Error_Info,UnknownFun)
	End If
	Return r
End Sub

Sub evl(ex)
Error_Info=0

exp=ex
length=StrLength(exp)
flag=0	
b=StrIndexOf(exp,"(",0)
	Do While b>=0
		flag=flag+1
		For i=b+1 To length-1
			t=StrAt(exp,i)
			If t="(" Then
				flag=flag+1
			Else If t=")" Then
				flag=flag-1
			End If
			If flag=0 Then Exit
		Next
		
		If flag<>0 Then
			Error_Info=bit.OR(Error_Info,BraceErr)
			Return 0
		End If
		
		s1=SubString(exp,0,b)
		s2=SubString(exp,i+1,StrLength(exp)-i-1)
		sm=evl(SubString(exp,b+1,i-b-1))
		If Error_Info<>0 Then Return -1
		
		f=fun_detect(s1)
		If f<0 Then
			exp=s1 & sm & s2
		Else
			tmp1=SubString(s1,0,f)
			tmp2=SubString(s1,f,StrLength(s1)-f)
			exp=tmp1 & fun(tmp2,sm) & s2
			If Error_Info<>0 Then Return -1
		End If
		b=StrIndexOf(exp,"(",0)
		length=StrLength(exp)
	Loop

	r=simpleEvl(exp)
	If Error_Info<>0 Then Return -1
	
	Return r
End Sub

Sub Button1_Click
    s=tb1.Text
	'SIN(2/9)-ASIN((1+SIN(3.14/2))/2)=-1.349835495
	tb2.Text=Evl(s)
	tb3.Text=Error_Info
End Sub