Вверх ↑
Разработчик
Ответов: 4698
Рейтинг: 426
#1: 2011-02-15 15:57:51 ЛС | профиль | цитата
Решил немного опробовать VB 6.0, так как именно его мы будем проходить в школе, попробовал, как сказать, удачно, уже с час сижу мучаю простой код. Ругается все время на одну строчку во время выполнения, я ее выделю комментарием. Так же к посту прикрепил архивчик с проектом этой программы, на всякий случай.
#bas
Private Type Parser
index As Long
data As String
oper As Byte
token As String
End Type
Private Sub Parser_GetToken(ByRef pr As Parser)
pr.oper = 0
'Dim c As String
c = Mid(pr.data, pr.index, 1) ' Вот на эту гадость он ругается, только сменю pr.index на какое-нибудь число, так все сразу ок
While c = " " And pr.index < Len(pr.data)
pr.index = pr.index + 1
c = Mid(pr.data, pr.index, 1)
Wend
'select block
If c >= "0" And c <= "9" Then
pr.oper = 1
While c >= "0" And c <= "9" And pr.index < Len(pr.data)
pr.token = pr.token + c
pr.index = pr.index + 1
c = Mid(pr.data, pr.index, 1)
Wend
Else
If c = "+" Or c = "-" Or c = "*" Or c = "/" Then
pr.oper = 2
pr.token = c
pr.index = pr.index + 1
Else
If c = "(" Or c = ")" Then
pr.oper = 3
pr.token = c
pr.index = pr.index + 1
Else
MsgBox "Unknown token at position" + Str$(pr.index)
End If
End If
End If
End Sub
Private Function Parser_Parse(ByRef pr As Parser) As Double
pr.oper = 0
pr.index = 0
Dim x As Double
Parser_GetToken pr
Parser_level1 pr, x
If pr.oper = 0 Then Parser_Parse = 0 Else Parser_Parse = x
End Function
Private Sub Parser_level1(ByRef pr As Parser, ByRef x As Double) '+ -
Parser_level2 pr, x
If pr.oper <> 0 Then
Dim y As Double
Parser_level2 pr, y
If pr.oper <> 0 Then
While pr.oper = 2
Select Case pr.token$
Case "+"
x = x + y
Case "-"
x = x - y
End Select
Wend
End If
End If
End Sub
Private Sub Parser_level2(ByRef pr As Parser, ByRef x As Double) '* /
Parser_level3 pr, x
If pr.oper <> 0 Then
Dim y As Double
Parser_level3 pr, y
If pr.oper <> 0 Then
While pr.oper = 2
Select Case pr.token$
Case "*"
x = x * y
Case "/"
x = x / y
End Select
Wend
End If
End If
End Sub
Private Sub Parser_level3(ByRef pr As Parser, ByRef x As Double) '()
If pr.oper = 1 Then
x = CInt(pr.token)
Else
If pr.oper = 3 Then
Parser_GetToken pr
If pr.oper <> 0 Then
Parser_level1 pr, x
If pr.oper <> 3 And pr.token$ <> ")" Then
pr.oper = 0
MsgBox "Excepted ')' at line " + Str$(pr.index)
End If
End If
End If
End If
End Sub

Private Sub Command1_Click()
Dim pr As Parser
pr.data = "2 + 2"
MsgBox Parser_Parse(pr)
End Sub
calculator.rar
карма: 10
0
файлы: 1calculator.rar [1.5KB] [89]