На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Друзья, соблюдайте, пожалуйста, правила форума и данного раздела:
Данный раздел не предназначен для вопросов и обсуждений, он содержит FAQ-заготовки для разных языков программирования. Любой желающий может разместить здесь свою статью. Вопросы же задавайте в тематических разделах!
• Если ваша статья может быть перенесена в FAQ соответствующего раздела, при условии, что она будет оформлена в соответствии с Требованиями к оформлению статей.
• Чтобы остальным было проще понять, указывайте в описании темы (подзаголовке) название языка в [квадратных скобках]!
Модераторы: Модераторы
  
> Форматтеры исходного кода Pascal , [Pascal]
    Форматтеры кода для Pascal


    Часто, при просмотре чужих исходников на форуме, возникает желание отформатировать код. Свои тексты также иногда неплохо бы приводить в «божий вид». Тогда и возникает желание автоматизировать рутинную работу. А т.к. Pascal появился далеко не вчера, то и подобные утилиты для него уже давно существуют. Перечислю лишь некоторые:

    НазваниеЛицензияТип приложенияОСГод выпускаПримечание
    BP7SBпроприетарная, платнаяконсольноеDOS1993
    PTOP?консольное2004Автор Aleksej Kozlov, для Virtual Pascal
    PTOPGPLконсольноеDOS, Linux, Windows2008Входит в состав Free Pascal
    JCF (JEDI Code Format)MPL 1.1 или GPL 2.0консольное, GUI, плагин к IDEWindows2009
    GExpertsThe Open Source Definitionплагин к IDEWindows2011


    В интернете можно встретить упоминания и о множестве других форматтеров.

    Лично мне довелось пользоваться двумя:
    - ptop (из состава FPC)
    - JCF

    О них я и расскажу.

    Для начала о JCF, как о более удобном и лёгком в освоении, а затем о ptop, т.к. вместе с FPC он присутствует на многих компьютерах у школьников и студентов - основных авторов тем форума Pascal.
    Сообщение отредактировано: Jin X -
      JCF (JEDI Code Format)


      Описание этого пакета программ будет довольно коротким из-за интуитивно понятного интерфейса, а также хорошей справки к этому пакету.

      Это самостоятельный пакет программ, который можно найти по ссылке.

      Из недостатков хочется отметить пару несущественных:
      - при описании блока констант, почему-то не делает отступ,
      - в начале форматируемого файла обязательно присутствие строки program, unit, package или library,
      - только англоязычный интерфейс.

      Установка пакета:
      1. Скачать два архивных файла «jcf_243_exe.zip» и «Jcf_243_source.zip».
      2. Создать папку «c:\Program Files\JCF».
      3. Распаковать содержимое архива «jcf_243_exe.zip» в эту папку.

      В состав пакета входит несколько исполняемых файлов. Нас будут интересовать только три, а точнее два из них:
      JCF.exe — консольная версия форматтера
      JCFGui.exe — GUI версия форматтера кода
      JCFNotepad.exe – GUI версия форматтера кода с текстовым редактором

      Настроек форматирования очень много, но пользуясь JCFNotepad можно сразу наблюдать за результатоми их изменения.

      "Из коробки" он поступает с ненастроенным форматированием - нужно настроить самостоятельно. Но если поискать в интернете, то можно узнать, что архив с исходниками JCF в папке "Jcf_243_source.zip\Test\TestCases\" содержит три файла с "готовыми" настройками. Один из них "JCFTestSettings.cfg" - настроен согласно рекомендациям от Borland. Его нужно скопировать в папку с распакованным JCF и переименовать в "JCFSettings.cfg".

      Результат форматирования сохраняется в папке с исходником, с тем же именем, что и у исходника, но с расширением ".out" (возможно настроить иначе).
        PTOP (из Free Pascal)


        Эта утилита входит в состав Free Pascal Compiler http://www.freepascal.org, и скачать её исполняемый файл и исходники можно только вместе со всем пакетом программ. Описание на английском (довольно ироничное) доступно по http://www.freepascal.org/tools/ptop.var.

        Как следует из описания утилиты, она является модернизацией другой утилиты, восходящей корнями к программе PP (pretty-printer), опубликованной в 1977 году.

        Программа — консольная, и у неё отсутствует графический интерфейс.
        При форматировании иногда получается не вполне корректный результат:
        из «каши»
        ExpandedWrap disabled
          If a=0 then
          Begin
          If b=0 then
          If c=0 then
          Writeln('-1')
          else
          Writeln('0')
          Else
          Begin
          x:=c/b;

        получается
        ExpandedWrap disabled
            If a=0 Then
              Begin
                If b=0 Then
                  If c=0 Then
                    Writeln('-1')
                Else                              <---------- здесь не хватает ещё одного отступа
                  Writeln('0')
                Else
                  Begin
                    x := c/b;

        Но, в целом, утилита хорошая.

        Перед тем как перечислить опции запуска утилиты, расскажу о том, как я её использую.
        Скрытый текст
        Если нужно по-быстренькому переформатировать «исходную кашу», просто запускаю из командной строки
        ptop исходный.pas результат.pas
        Т. к. я пользуюсь файловым менеджером a-la NortonCommander (a-la Far или a-la TotalCommander), то проблем с вводом имени исходного файла не возникает (Ctrl-Enter). Имя выходного файла я обычно делаю похожим на исходное, т. е. опять ввожу имя исходного файла и добаляю какой-либо символ. Например,
        ptop test1.pas test1x.pas

        Но, иногда, возникает желание получить на выходе файл, отформатированный с настройками не «по-умолчанию», а «на мой вкус». Такой вариант также предусмотрен разработчиками. Запускаем утилиту со следующими параметрами
        ptop -g ptop.cfg
        После этого будет создан файл «ptop.cfg». Это текстовый файл, его можно открыть и отредактировать в штатном для Windows «Блокноте». Возможностей редактирования, правда, немного — формат только прописанных разработчиком ключеых слов, новых — не добавить. Поэкспериментировав с настройками, получаем итоговый «my_ptop.cfg», который и будем использовать при вызове
        ptop -c my_ptop.cfg test1.pas test1x.pas
        Строка вызова немного увеличилась, что вызывает неудобство, но тут уж ничего не поделаешь. Вариант улучшения ситуации — только создание пакетного файла (".bat", ".cmd", ".vbs" или др.) для запуска утилиты с параметрами.


        Теперь, можно привести вольный перевод официальной странички для ptop. Я его приведу здесь только потому, что ранее мне он не встречался, и не каждый умеет читать по-английски.

        Строка запуска программы
        ptop [-v] [-i indent] [-b bufsize ] [-c optsfile] infile outfile

        infile и outfile – соответственно входной и выходной файлы.
        -h выводит на экран краткую справку о параметрах запуска программы из командной строки.
        -c optsfile взять настройки форматирования из конфигурационного файла optsfile. Если параметр пропущен, то будут использоваться внутренние настройки «по-умолчанию». Также см. параметр -g
        -i ident устанавливает размер отступа в блоке равным ident пробелов (для блоков BEGIN END и др)
        -b bufsize устанавливает размер буфера равным bufsize.
        -v выводит дополнительные подробности. На настоящий момент — только номер считываемой/записываемой строки и некоторые сообщения об ошибках.
        -g optsfile сохраняет настройки «по-умолчанию» в файл optsfile.

        Описание конфигурационного файла «ptop.cfg»

        Структура конфигурационного файла это простые блоки, повторяющиеся некоторое (20-30) количество раз для каждого ключевого слова Pascal'я, которое известно программе ptop. Список ключевых слов можно уточнить взглянув в дефолтный конфигурационный файл ptop или в исходник «ptopu.pp».

        Каждый блок конфигурационного файла состоит из двух строк, описывающих как ptop должен реагировать на каждое конкретное ключевое слово.

        Первая строка без квадратных скобок имеет следующий формат:
        keyword=option1,option2,option3,...

        Если среди опций присутствует опция "dindonkey", то необходима вторая строка вида:
        [keyword]=otherkeyword1,otherkeyword2,otherkeyword3,...

        Как видно, блок содержит два вида идентификаторов - ключевые слова (keyword и otherkeyword1..3) и опции (option1..3).

        Ключевые слова (keyword) это зарезервированные слова Pascal'я (вроде, BEGIN, END, CASE, IF, THEN, ELSE, IMPLEMENTATION). Дефолтный конфигурационный файл ptop содержит большинство из них.

        Кроме зарезервированных слов Pascal'я к ключевым словам относятся и символьные конструкции языка, используемые в операторах и для обозначения комментариев. Вот они:
        Название конструкцииОператор в Pascal'е
        casevar: в метке опрератора case (не то же, что и 'colon')
        becomes:=
        delphicomment//
        opencomment{ или (*
        closecomment} или *)
        semicolon;
        colon:
        equals=
        openparen[
        closeparen]
        period. в конструкции подобной '1..6'


        Действия, которые должны выполнятся, если в обрабатываемом тексте встретится ключевое слово описываются опциями
        Опция (option)Действие
        upperВыводит ключевое слово в верхнем регистре ("СЛОВО").
        lowerВыводит ключевое слово в нижнем регистре ("слово").
        capitalВыводит ключевое слово с заглавной первой буквой, и маленькими остальными буквами ("Слово").
        crsuppПодавляет «перевод строки» перед ключевым словом.
        crbeforeСтавит «перевод строки» перед ключевым словом. (не действует вместе с опцией crsupp :) )
        crafterСтавит «перевод строки» после ключевого слова.
        blinbeforeВставляет пустую строку перед ключевым словом.
        spbefДобавляет один пробел перед ключевым словом.
        spaftДобавляет один пробел после ключевого слова.
        gobsymВыводит символы, которые следуют за ключевым словом, но не влияющих на вывод. Выводит до терминатора (терминаторы жестко прописаны в PtoP).
        dindonkeyЭто ключевое слово отменяет предыдущий уровень отступа блока операторов в обрабатываемом тексте для других ключевых слов из списка, который приводится в следующей строке конфигурационного файла.
        dindentЭто ключевое слово всегда отменяет предыдущий уровень отступа в обрабатываемом тексте.
        inbytabКлючевое слово является началом следующего уровня отступа (блока операторов в тексте, до окончания которого все последующие элементы блока сдвинута в строке на несколько пробелов) относительно первого символа этого ключевого слова.
        Например,
        ExpandedWrap disabled
          TRec = Record
                   field1 : Integer;
                   field1 : Byte;
                 End;
        inbyindent То же,что и inbytab, но отступ будет относительно предыдущего отступа.
        Например,
        ExpandedWrap disabled
          TRec = Record
            field1 : Integer;
            field1 : Byte;
          End;


        Опция "dindonkey" требует несколько дополнительных параметров, которые определяются во второй строке описания ключевого слова (с квадратными скобками).
        В этой строке определяются ключевые слова, завершающие блок операторов в обрабатываемом тексте, выделяемых отступом в строках.

        Пример
        Строки
        else=crbefore,dindonkey,inbytab,upper
        [else]=if,then,else

        Означают:
        1. Рассматриваем ключевое слово 'else' (оно расположено слева от знака равно).
        2. Когда парсер ptop найдёт 'else', исходя из опций, будет выполнено следующее:
        - (crbefore) Не позволить другому коду находится на одной строке перед ключевым словом ('else' будет одним в строке)
        - (dindonkey) В следующей строке конфигурационного файла будут определены ключевые слова, для которых "наше" ('else') отменяет отступ для блока операторов из обрабатываемого текста.
        - (inbytab) Следующие опрераторы из обрабатываемого текста будут выводится с отступом.
        - (upper) Ключевое слово вывести в верхнем регистре ('ELSE').
          Цитата Федосеев Павел @
          Программа — консольная, и у неё отсутствует графический интерфейс.
          Специально для этой утилиты мной несколько лет назад был написан GUI, на Лазарусе, с возможностью менять язык интерфейса, изменять некоторые настройки форматирования, и изменять кодировку исходника (этим, кстати, тексты на форуме тоже грешат):
          Сообщение отредактировано: volvo877 -

          Прикреплённая картинка
          Прикреплённая картинка
            Я помню, несколько лет назад на другом форуме Вы предлагали GUI для ptop. Но потом, из-за невозможности проверить результат преобразований Unicode->OEM на компьютерах с другой системной кодировкой решили не продолжать разработку и удалить программу из общего доступа.

            Если Вы сочтёте возможным, опубликуйте программу, добавив в описании ограничения на имена файлов форматируемых текстов.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0419 ]   [ 18 queries used ]   [ Generated: 19.03.24, 08:27 GMT ]