PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Tidy для PureBasic


Tidy для PureBasic

Сообщений 1 страница 6 из 6

1

Скачать

Кроме уже известного варианта "Правка -> Форматировать код" оказалось есть вариант, который расставляет пробелы вокруг операторов и после запятых в функциях, ну и комментарии исправляет, которые ставят кавычку в начале строки, а после форматирования кода сдвигают её согласно отступу нижней строки.
Собственно ссылка
https://i.imgur.com/PlzcU1r.png

Отредактировано AZJIO (08.04.2024 15:28:07)

0

2

Я начал пробовать свой вариант, вот.
Взял один из своих парсеров и попытался сделать правильную расстановку пробелов вокруг операторов. Пока что эксперимент. Как обычно у меня уже есть определение строка, комментарии, апострофы, асм-код, все что не из перечисленных является ключевые слов и операторы. Добавил флаг, если начало строки то эти пробелы не трогаем, как только что-то пошло, что не пробел, то переключаем на проверку двойных и более пробелов. Как только лишний пробел вместо него пишу "1", только не число а код управляющих символов, их обычно нет в коде явно, они могут быть записаны как Chr(1), но не как буква, так как у них нет видимого отображения, хотя Scintilla поддерживает их отображение. В итоге я потом заменяю Chr(1) на ничего избавляясь от лишних пробелов. Но в идеале я бы хотел сделать следующее: если второй пробел, то запомнил позицию пробела и иду дальше до первого непробела, и когда найден переписываю строку в запомненную позицию, то есть сдвигаю влево на число пробелов. Замена действует также, но менее оптимизировано. Ещё была мысль делить когда второй пробел то запоминаем левую часть в NewList, а правую продолжаем парсить, а потом соединить куски. В принципе создание NewList потребует копирование строк, поэтому опять возвращаюсь к варианту сдвига строки. И ещё вариант запоминание указателей, а в повтор пробелов пишем 00, когда строка кончилась читаем куски с указателей и собираем строку. Но если надо добавить пробел, то сдвиг вправо пока не получается. Возможно надо выделить память чтобы в ней производить манипуляции, допускающие сдвиг данных в любую сторону.

0

3

Tidy + SyntaxHighlighting - ссылка на тему на оф.форуме.
Вот тут больше продвижений получилось. Даже в некоторых случаях получше чем в SmartIndent.
На данный момент вокруг разделителей (,) правильные пробелы. Вокруг операторов +-|&%!~<>= причём в случаях когда сравнение или приравнивание то "-1" пишется без пробела, в отличии от SmartIndent.
Добавил выравнивание комментариев, так как оно у меня уже было отдельным кодом.
Добавил удаление табов и пробелов в пустой строке.
В SmartIndent для ASM строк вставляются ненужные пробелы после !.

На счёт безопасности обработки:
1. Пробелы добавляются вокруг операторов, это не может навредить, а всё токены проверяются на тип и определяется официальной библиотекой SyntaxHighlighting.
2. Удаление пробелов (RTrim) только вокруг разделителей (,), что тоже не принесёт поломки кода.
3. У звёздочки * справа проверяется число ли, то есть не сломает указатели, а все переменные начинаются с буквы, первым число запрещено.
4. Удаление табов и пробелов в пустой строке только между двумя переносами, при наличии между ними только пробелов.
5. Выравнивание комментариев работает только со строкой комментариев. То есть тип данных помечен как комментарий, причём с каждой строкой отдельно, потому что они не группируются в многострочный даже если идут друг за другом.

Проверил скорость работы 6000 строк на 4 мс (с отключенным отладчиком).

Отредактировано AZJIO (16.03.2024 22:04:18)

0

4

Добавил Tidy для Linux без использования SyntaxHighlighting.dll.
Проверил на нескольких исходниках, в том числе добавил в код проверку на отсутствие модификации файла методом удаления пробелов, потому что пока неизвестно, может ещё какие нибудь ошибки всплывут.

Первый вариант бы методом забивания лишних пробелов символом Chr(1), а добавление методом сначала вставки Chr(n), а потом замены на символ с пробелом.
Новый вариант выделяет память и дублирует в нём строку, но при этом намного проще добавить лишний пробел, просто увеличить указатель и приравнять пробел.
Остаётся корректировать правила просмотра вперёд и просмотра назад для каждого символа. Например не сделано: просмотр назад 2 символа, если "=", то после минуса пробел не добавлять, или перед скобкой пробелы удаляются, но для ключевых слов And, Or, Not перед скобкой нужен пробел.

Отредактировано AZJIO (07.04.2024 14:14:58)

0

5

Обновление
Добавлена обработка звёздочки "*". Проверяется что это не указатель.
Добавлена проверка что перед скобкой нет операторов или ключевых слов And, Not, Or, чтобы оставить пробел между ними.
Добавлена более сложная проверка операторов + / |
Добавлена более сложная проверка оператора "-", чтобы при предшествующем "=" не добавлять пробел после оператора.

В первый пост добавлена ссылка на архив.

И кстати, я обновил почти все инструменты использующий посимвольный анализатор кода в связи с тем что "~" и "!" имеют логическое значение, кроме строк и ASM-кода, поэтому пришлось привнести изменения там где это необходимо.

Отредактировано AZJIO (08.04.2024 15:34:06)

0

6

Обновление
Добавлена поддержка языка
Исправлена ошибка, добавлялся символ перед скобкой. (Linux-версия ещё не пересобрана)
Добавлено правило "-" перед запятой не имеет пробела после. А также перед скобкой, если приравнивание или перечисление через запятую.

Ошибку выявил при использовании на исходниках 3D-графики от pf shadoko

Способ тестирования
1. Сравниваю результат своего Tidy с результатом обработчика от HeX0R. Для снижения разницы можно оба исходника обработать с помощью пункта "Форматировать код", чтобы отступы были одинаковы, так как код от HeX0R обрабатывает отступы.
2. Сравниваю результат от предыдущей своей версии с новой версией. То есть ввёл модернизацию, сравниваю что она изменяет в новом исходнике. Сравнивать с оригиналом бесполезно, там столько отличий что можно целый час отслеживать.
3. Ну и обязательно смотрю, чтобы мессага показала "Успешно", то есть код не модернизировался символами непробелов.

Отредактировано AZJIO (12.04.2024 08:35:57)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Tidy для PureBasic