Допустим есть такой код
- Код: Выделить всё
'Коммент1
Msgbox "Hello!" rem коммент2
rem коммент3
нужно удалить из него все комменты. Мне просто интересно, совсем у меня голова отупела или нет
'Коммент1
Msgbox "Hello!" rem коммент2
rem коммент3
Хакер писал(а):Перенос строки (символ подчёркивания) в это BASIC-е будет?
На чём написать функцию?
jangle писал(а):На VB или PB, мне просто интересен подход к решению этой задачи. Сколько их вообще может быть. Какой самый эффективный.
jangle писал(а):Кстати вопрос на засыпку. Кто нибудь может написать функцию удаления текстовых комментариев комментариев из BASIC кода
Хакер писал(а):Это зависит от контекста задачи. Если это просто крохотная утилита, то решение одно. Если бы это нужно было в рамках какой-то большой программы, в которой нужны какие-то ещи процессинги кода, то логично, что и вырезатель комментариев, и код, выполняющий другие обработки — полагались бы на общую функциональную базу.
А код твой непонятен. Это VB или не VB. Судя по MsgBox-у — VB. Судя по тому, что после MsgBox "Hello!" стоит Rem — это не VB (в VB такое не разрешено). Если это не VB, то нельзя писать код, вырезающий комментарий, пока не станут ясны синтаксические особенности языка.
FireFenix писал(а):jangle писал(а):Кстати вопрос на засыпку. Кто нибудь может написать функцию удаления текстовых комментариев комментариев из BASIC кода
Регуляркой, от ' до vbCrLf и от rem до vbCrLf?
FireFenix писал(а):Регуляркой, от ' до vbCrLf и от rem до vbCrLf?
Было:
MsgBox "Не могу найти 'abc' в репозитории" ' Сообщили об ошибке
Стало:
MsgBox "Не могу найти
Да это код PB, там два типа комментов: ' и Rem
Хакер писал(а):FireFenix писал(а):Регуляркой, от ' до vbCrLf и от rem до vbCrLf?
О, дотнетчик пришёл
Пожалуйста, регуляркой:
- Код: Выделить всё
Было:
MsgBox "Не могу найти 'abc' в репозитории" ' Сообщили об ошибке
Стало:
MsgBox "Не могу найти
jangle писал(а):Нужно парсить код. У меня получилось с двумя циклами, некрасиво, но работает.
Интересно есть ли другие алгоритмы.
for(func_ptr = start_function; func_ptr != 0; func_ptr = func_ptr(some_context));
Хакер писал(а):Выглядит так:
- Код: Выделить всё
for(func_ptr = start_function; func_ptr != 0; func_ptr = func_ptr(some_context));
'/****************************************************************
'/ Удаление комментариев из кода
Function DelComment (ByVal PB_SOURCE As String) As String
Dim PB_Source_Arr(1 To ParseCount(PB_SOURCE, Any Chr$(10) )) As String
Parse PB_SOURCE, PB_Source_Arr(), Any Chr$(10)
Dim metka As Long 'метка кавычек
Dim i As Long 'счетчик строк
Dim t As Long
Dim arr_count1 As Long
Dim out_txt As String
'/удаление комментов в начале строк
For i=1 To UBound(PB_Source_Arr)
If Mid$(Trim$(PB_Source_Arr(i)),1,1)="'" Then
PB_Source_Arr(i)=" "
End If
If Mid$(LCase$(Trim$(PB_Source_Arr(i))),1,3)="rem" Then
PB_Source_Arr(i)=" "
End If
Next i
'-----------------------------------------------------
For i=1 To UBound(PB_Source_Arr)
For t=1 To Len(PB_Source_Arr(i))
If Mid$(PB_Source_Arr(i),t,1)=Chr$(34) Then 'устанавливаем метку если коммент в кавычках " ' "
If metka=0 Then
metka=1
Else
metka=0
End If
End If
If Mid$(PB_Source_Arr(i),t,1)="'" Then
If metka=0 Then
PB_Source_Arr(i)=Mid$( PB_Source_Arr(i), 1, t-1) & $CrLf
End If
End If
Next t
Next i
For i=1 To UBound(PB_Source_Arr)
For t=1 To Len(PB_Source_Arr(i))
If Mid$(PB_Source_Arr(i),t,1)=Chr$(34) Then 'устанавливаем метку если коммент в кавычках " rem "
If metka=0 Then
metka=1
Else
metka=0
End If
End If
If Mid$(LCase$(Trim$(PB_Source_Arr(i))),t,3)="rem" Then
If metka=0 Then
PB_Source_Arr(i)=Mid$( PB_Source_Arr(i), 1, t-1) & $CrLf
End If
End If
Next t
Next i
For i=1 To UBound(PB_Source_Arr)
out_txt=out_txt & PB_Source_Arr(i)
Next i
Function= out_txt
End Function
'/****************************************************************
jangle писал(а):Чето я не пойму как это работает. Можешь на VB функцию написать?
Dim R as CRouter
Set R = StartRouter
Do
Set R = R.Route(some_context)
Loop Until R Is Nothing
Хакер писал(а):Пожалуйста, регуляркой:
- Код: Выделить всё
Было:
MsgBox "Не могу найти 'abc' в репозитории" ' Сообщили об ошибке
Стало:
MsgBox "Не могу найти
FireFenix писал(а):Тогда построчно, делаем поиск с конца строки, кавычки и двойной кавчки, если Pos двойной кавычки меньше одинарной, то считаем одинарную как комент и удаляем
Msgbox " A ' B "" C "" D ' E ", F, "G" ', H ' I " J ' "" K ' " '
FireFenix писал(а):Хакер писал(а):Пожалуйста, регуляркой:
- Код: Выделить всё
Было:
MsgBox "Не могу найти 'abc' в репозитории" ' Сообщили об ошибке
Стало:
MsgBox "Не могу найти
не подумал +)
Тогда построчно, делаем поиск с конца строки, кавычки и двойной кавчки, если Pos двойной кавычки меньше одинарной, то считаем одинарную как комент и удаляем
' А тут все обломится "хе хе "
rem ' А тут все обломится "хе хе "
Msgbox " A ' B "" C "" D ' E ", F, "G" ', H ' I " J ' "" K ' " '
MsgBox " A ' B "" C "" D ' E ", F, "G"
Хакер писал(а):Дело в том, что у PB простой синтаксис, по сравнению с VB.
jangle писал(а):Так комменты в обоих случаях почти одинаковые, и способ удаления их тоже.
Если А > B То
С = А + В
Diamock писал(а):Из всего вышесказанного, я сделал следующий вывод: Си-подобный - это не главное. Важен сам принцип создания РАБОТАЮЩЕГО компилятора. Синтаксис может быть и таким
Diamock писал(а):Что самое интересное в созданном на VB компиляторе, будет ли приложение зависеть от msvbvm?
Diamock писал(а):Если нет, то каждый с прямыми руками и прямым мозгом, при определённом трудолюбии сможет создать свой компилятор под практически любую платформу
Хакер писал(а):Я не хочу участвовать в приближении этого ужасного будущего.
В том уголке, где я живу оно - это "ужасное завтра" пока еще не наступило, но неумолимо наступает на пятки и прямо таки дышит в затылокХакер писал(а):Это будущее уже наступило. По крайней мере в развитых уголках планеты.
Хакер писал(а):FireFenix писал(а):Тогда построчно, делаем поиск с конца строки, кавычки и двойной кавчки, если Pos двойной кавычки меньше одинарной, то считаем одинарную как комент и удаляем
- Код: Выделить всё
Msgbox " A ' B "" C "" D ' E ", F, "G" ', H ' I " J ' "" K ' " '
Обрабатай, пожалуйста. Если будешь искать с конца строки, получешь плохой результат. Будешь сначала строки искать — получишь плохой результат.
Хакер писал(а):Как только FireFenix придумает вариант
FireFenix писал(а):Проверяем чётность двойных кавычек, с последней чётной кавычки ищем одинарную и от неё обрезаем
jangle писал(а):Кстати вопрос на засыпку. Кто нибудь может написать функцию удаления текстовых комментариев комментариев из BASIC кода
Public Function RemoveComments(ByVal Text() As String) As String()
If Text.Length = 0 Then Return New String() {}
Dim InString As Boolean, InName As Boolean
Dim Line As String
Dim Result(Text.Length - 1) As String
Dim Q As Integer, W As Integer
For Q = 0 To Text.Length - 1
Line = Text(Q)
InString = False
InName = False
For W = 0 To Line.Length - 1
Select Case Char.ToLower(Line(W))
Case """"c
InString = Not InString
Case "["c
If Not InString Then InName = True
Case "]"c
If Not InString Then InName = False
Case "'"c
If Not InString Then
Line = Line.Substring(0, W)
Exit For
End If
Case "r"c
If Not InString AndAlso Not InName _
AndAlso W + 2 < Line.Length AndAlso Char.ToLower(Line(W + 1)) = "e"c AndAlso Char.ToLower(Line(W + 2)) = "m"c _
AndAlso (W = 0 OrElse Not Char.IsLetterOrDigit(Line(W - 1))) _
AndAlso (W + 3 = Line.Length OrElse Not Char.IsLetterOrDigit(Line(W + 3))) _
Then
Line = Line.Substring(0, W)
Exit For
End If
End Select
Next W
Result(Q) = Line
Next Q
Return Result
End Function
Хакер писал(а):Судя по тому, что после MsgBox "Hello!" стоит Rem — это не VB (в VB такое не разрешено).
Хакер писал(а):В PB нет переноса строки с помощью подчёркивания. В VB оно есть. Твой код на это не расчитан."
Плюс есть ещё один момент касательно комментариев. Есть случай, когда апостроф не внутри строки, но и не начинает комментарий. Я думаю твой код на этом сфейлит.
Qwertiy писал(а):VS2010 с Вами не согласна
jangle писал(а):Что значит апостроф не внутри строки?
Хакер писал(а):Нашёл, блин, что привести в качестве примера. Мне фиолетово, что думает VS2010, потому что последняя версия VB — VB6.
Хакер писал(а):Значит как часть строковой константы, в которой он играет роль обычного символа.
jangle писал(а):Выложи скомпилированный бинарник, у меня нет VS2010
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41