#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
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Решил немного опробовать VB 6.0, так как именно его мы будем проходить в школе, попробовал, как сказать, удачно, уже с час сижу мучаю простой код. Ругается все время на одну строчку во время выполнения, я ее выделю комментарием. Так же к посту прикрепил архивчик с проектом этой программы, на всякий случай.
|
|||
карма: 10 |
| ||
файлы: 1 | calculator.rar [1.5KB] [91] |
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
ну так параметр типа Integer, а пытаешься передать Long
|
|||
карма: 27 |
|
Ответов: 4631
Рейтинг: 749
|
|||
Assasin, а что пишет при ошибке?
|
|||
карма: 26 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Dilma писал(а): ну так параметр типа Integer, а пытаешься передать LongЯ пробовал изменять тип Index на Long, прежний был Integer, все равно не работало Netspirit писал(а): Assasin, а что пишет при ошибке?invalid procedure call or argument |
|||
карма: 10 |
|
Ответов: 4631
Рейтинг: 749
|
|||
Может этот index принимает какие-то недопустимые значения (например, отрицательные)?
|
|||
карма: 26 |
|
Ответов: 5227
Рейтинг: 587
|
|||
Assasin, pr.index = 0, что недопустимо в данной функции для стартовой позиции
|
|||
карма: 4 |
| ||
Голосовали: | Assasin |
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
andrestudio писал(а): Assasin, pr.index = 0, что недопустимо в данной функции для стартовой позицииУжас, никак не мог об этом подумать, видимо теперь для меня все слишком простое непонятным стало |
|||
карма: 10 |
|
Ответов: 5227
Рейтинг: 587
|
|||
Assasin, а что там собственно непонятно, чем скажем Mid от Copy в KOL отличается, глянь в код компонента и увидишь там проверку на "0" c инкрементом свойства Position
------------ Дoбавленo в 18.50: это всё вигня, я на пустом месте бывает по два дня буксую, нужно просто дать себе остыть и ручник сам снимается как правило |
|||
карма: 4 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Новая проблема, есть класс Parser:
Object variable or With block variable not set Что это может значить? ------------ Дoбавленo в 18.52: Все, понял, экземпляр класса то создать нужно |
|||
карма: 10 |
|
Ответов: 5227
Рейтинг: 587
|
|||
andrestudio писал(а): c инкрементом свойства PositionAssasin писал(а): Formula.Text------------ Дoбавленo в 19.12: ну вот, а я уже поверил что он есть |
|||
карма: 4 |
|
10