Автоматична локалізація структурних помилок в процесі форматування вихідних текстів Pascal + Delphi (исходники), Різне, Програмування, статті

Відладчики і форматер вихідних кодів програм, які використовуються в сучасній практиці програмування, базуються в основному на принципі односпрямованої обробки тексту. З вихідного файлу вводиться рядок тексту і тут же проводиться висновок цієї інформації у вихідний файл. Максимум, що дозволяє даний підхід, це виділяти оператори на окремий рядок і виводити їх з відповідним зсувом. В даній статті буде расcмотрена модифікація наявного методу форматування, що отримала назву графічне форматування. Для PASCAL + DELPHI розроблений відладчик-форматер PGF (Pascal-programs Graphical Formatter), забезпечує наступні додаткові можливості:

1. Автоматичне ВИЯВЛЕННЯ і локалізація СТРУКТУРНИХ помилок з вказівкою найбільш ймовірного варіанту їх ВИПРАВЛЕННЯ.


2. Перетворення блоків за замовчуванням (коли є лише один виконуваний оператор в тілі умовного-або цикл-оператора) в явні блоки (додається begIN-eND).


3. Реальна структура програми, отримана після вищевказаних перетворень, візуалізується у вигляді форматованого тексту з використанням КОЛЬОРУ і жирності.


4. Оператори переходу (явні – GoTo, неявні – Exit, Halt, Continue …) позиційно і КОЛЬОРОМ вирівнюються на свою мітку (якщо немає мітки, то в потрібному місці генерується фантом-мітка), що робить їх помітними з першого погляду.


5. В текст програми додається велика кількість допоміжних коментарів структурного характеру, зокрема до всіх стуктурообразующім операторам приписуються коментарі з інформацією, що забезпечує їх взаємо-ПЕРЕХРЕСНІ посилання.


Підбираючи в меню бажані значення параметрів, можна легко налаштувати роботу програми на індивідуально бажаний профіль функціонування.


Для всіх *. PAS файлів створюються їх *. RTF еквіваленти, в яких нова структура програми (сформована в результаті нейтралізації неточностей), а також виявлені структурні помилки візуалізуються з допомогою відступів, кольору і жирності. При бажанні можна прямо в *. RTF-файлах налагодити тексту, зберегти їх “File: Save as”, вказавши режим “Save as type: Text document” і приписав до “File name” після імені файлу розширення “. PAS”. В цьому випадку виправлений текст замінить старий *. PAS файл і можна продовжувати налагодження в Turbo Pascal або Delphi.


Наочно бачачи реалізовану в початковому тексті програми реальну структуру, програміст легко може визначити необхідні корекції, щоб вона стала адекватна бажаної структури. Вам самим вирішувати, наскільки це полегшить розробку власної та адаптацію чужий програмної продукції, підвищить її надійність.


Цілком можливо, що застосування пакета в навчальному процесі та при оформленні ілюстраційних прикладів у підручниках також дасть позитивний ефект, оскільки більш наочна і якісна візуалізація структури програм полегшить засвоєння навчального матеріалу.


FreeWare, пакет розповсюджується безкоштовно. Система Windows. Користувач може сам переробити інтерфейс вихідних форм на свій розсуд (в інсталятор включені вихідні тексти програми); легко додати в інтерфейс будь-який бажаний мова (PGF.exe мультіноязичен, обсяг повідомлень невеликий і поки English, Russian, RuTranslit, Georgian, German, French, Spanish). Пакет розповсюджується кілька місяців і за цей час повідомлень про збої не надходило, тобто можете брати сміливо – якщо не допоможе, то вже, напевно, не зашкодить. Щоб скопіювати докладний опис, інсталятор або оновлення пакета PGF, перейдіть на сайтах GRAFOR.MOY.SU, GRAFOR.PVT.GE в розділ Files. Якщо PGF у Вас вже інстальований, то для оновлення достатньо скопіювати нову версію PGFWin.exe.


Однак мене тепер більше цікавить обговорення з користувачами питання про можливість і доцільність розвитку аналогічного підходу до інших мов програмування. Яка мова програмування Вам здається найбільш перспективним? Чи можете Ви взяти участь в подібних роботах? Чи знаєте Ви організацію, яка зацікавлена ​​в проведенні подібної роботи настільки, що готова її профінансувати, і як з нею зв’язатися? Можна відкрити загальну дискусію тут. В ідеалі це має бути модуль, що підключається до наявних транслятора з даної мови, а ще краще інтегрований в його нові розроблювані транслятори. Якщо Ви вже ведете схожі роботи, беріть сподобалися ідеї (локалізація структурних помилок; використання кольору і жирності для візуалізації структури; вирівнювання переходів по позиції їх мітки; генерація для структуроутворюючих елементів коментарів з взаімоперекрестнимі посиланнями; …).


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


Візуалізація неявних переходів і генерація фантом-міток.


function GetSourceEditor(Module: IOTAModule): IOTASourceEditor;


var  i: integer;


begin


  Result := nil;


  if not assigned(Module) then Exit;


  for i := 0 to Module.GetModuleFileCount – 1 do


    if Supports(Module.GetModuleFileEditor(i),


         IOTASourceEditor, Result)


    then  break;


end;


{{ www.grafor.pvt.ge PGF(Ver 1.3 activ 01.07.2009) formatted 24. 5.2009/13:22 }


{{  1 }        function GetSourceEditor(Module:IOTAModule):IOTASourceEditor;


{{  2 }        var i:integer;


{{  3 fb  }     begin {{ #17}


{{  4 f   }        Result:= nil;


{{  5 f   tb  }     if not assigned(Module) then begIN {{ #7}


{{  6 f V<======<} Exit; {{ #16}


{{  7 f I te  }     eND; {{t not assign #5}


{{  8 f I fb  }     for i:= 0 to Module.GetModuleFileCount – 1 do begIN {{ #14}


{{  9 f I f   }        if Supports(Module.GetModuleFileEditor(i),


{{ 10 f I f   }        IOTASourceEditor, Result)


{{ 11 f I f   tb  }     then begIN {{ #13}


{{ 12 f IV<=====<} break; {{ #15}


{{ 13 f IIf   te  }     eND {{t GetModuleF #11}


{{ 14 f IIfe  }     eND; {{f GetModuleF #8}


{{ 15 f I>>=====>} {{FANTOM02:{LABEL} {{ #12}


{{ 16 f >>======>} {{FANTOM01:{LABEL} {{ #6}


{{ 17 fe  }     end; {{f GetSourceE #3}


Візуалізація глибоко вкладеної структури та виходу з неї.


function TIDETextExpert.HasShortCut(Menu: TIMainMenuIntf; Ch: Char): Boolean;


var


  SubMenuItem, SubMenu, MenuItems: TIMenuItemIntf;


  short, I, j: Integer;


begin


  short := ShortCut(Word(Ch), [ssCtrl]);


  Result := False;


  if menu <> nil then


  begin


    MenuItems := Menu.GetMenuItems;


    if MenuItems <> nil then


    try


      for j := 0 to MenuItems.GetItemCount – 1 do


      begin


        SubMenu := MenuItems.GetItem(j);


        if SubMenu <> nil then


        try


          for I := 0 to SubMenu.GetItemCount – 1 do


          begin


            SubMenuItem := SubMenu.GetItem(I);


            if SubMenuItem <> nil then


            try


              if SubMenuItem.GetShortCut = short then


              begin


                Result := True;


                Exit;


              end;


            finally


              SubMenuItem.Free;


            end;


          end;


        finally


          SubMenu.DestroyMenuItem;


        end;


      end;


    finally


      MenuItems.DestroyMenuItem;


    end;


  end;


end;


{{ www.grafor.pvt.ge PGF(Ver 1.3 activ 01.07.2009) formatted 24. 5.2009/13:22 }


{{  1 }       


{{  2 }        function TIDETextExpert.HasShortCut(Menu:TIMainMenuIntf;


{{  3 }        Ch:Char):Boolean;


{{  4 }        var


{{  5 }          SubMenuItem, SubMenu, MenuItems:TIMenuItemIntf;


{{  6 }          short, I, j:Integer;


{{  7 fb  }     begin {{ #45}


{{  8 f   }        short:= ShortCut(Word(Ch),[ssCtrl]);


{{  9 f   }        Result:= False;


{{ 10 f   tb  }     if menu <> nil then begIN {{ #43}


{{ 11 f   t   }        MenuItems:= Menu.GetMenuItems;


{{ 12 f   t   tb  }     if MenuItems <> nil then begIN {{ #42}


{{ 13 f   t   t   tb  }     try {{ #41}


{{ 14 f   t   t   t   fb  }     for j:= 0 to MenuItems.GetItemCount – 1 do begIN {{ #37}


{{ 15 f   t   t   t   f   }        SubMenu:= MenuItems.GetItem(j);


{{ 16 f   t   t   t   f   tb  }     if SubMenu <> nil then begIN {{ #36}


{{ 17 f   t   t   t   f   t   tb  }     try {{ #35}


{{ 18 f   t   t   t   f   t   t   fb  }     for I:= 0 to SubMenu.GetItemCount – 1 do begIN {{ #31}


{{ 19 f   t   t   t   f   t   t   f   }        SubMenuItem:= SubMenu.GetItem(I);


{{ 20 f   t   t   t   f   t   t   f   tb  }     if SubMenuItem <> nil then begIN {{ #30}


{{ 21 f   t   t   t   f   t   t   f   t   tb  }     try {{ #29}


{{ 22 f   t   t   t   f   t   t   f   t   t   tb  }     if SubMenuItem.GetShortCut = short then begIN {{ #25}


{{ 23 f   t   t   t   f   t   t   f   t   t   t   }        Result:= True;


{{ 24 f V<======<} Exit; {{ #44}


{{ 25 f I t   t   t   f   t   t   f   t   t   te  }     end; {{t GetShortCu #22}


{{ 26 f I t   t   t   f   t   t   f   t   t   fb  }     finally begIN {{ #28}


{{ 27 f I t   t   t   f   t   t   f   t   t   f   }        SubMenuItem.Free;


{{ 28 f I t   t   t   f   t   t   f   t   t   fe  }     eND {{f FINALLY #26}


{{ 29 f I t   t   t   f   t   t   f   t   te  }     end; {{t TRY #21}


{{ 30 f I t   t   t   f   t   t   f   te  }     eND; {{t SubMenuIte #20}


{{ 31 f I t   t   t   f   t   t   fe  }     end; {{f GetItemCou #18}


{{ 32 f I t   t   t   f   t   t   fb  }     finally begIN {{ #34}


{{ 33 f I t   t   t   f   t   t   f   }        SubMenu.DestroyMenuItem;


{{ 34 f I t   t   t   f   t   t   fe  }     eND {{f FINALLY #32}


{{ 35 f I t   t   t   f   t   te  }     end; {{t TRY #17}


{{ 36 f I t   t   t   f   te  }     eND; {{t SubMenu<>n #16}


{{ 37 f I t   t   t   fe  }     end; {{f GetItemCou #14}


{{ 38 f I t   t   t   fb  }     finally begIN {{ #40}


{{ 39 f I t   t   t   f   }        MenuItems.DestroyMenuItem;


{{ 40 f I t   t   t   fe  }     eND {{f FINALLY #38}


{{ 41 f I t   t   te  }     end; {{t TRY #13}


{{ 42 f I t   te  }     eND; {{t MenuItems< #12}


{{ 43 f I te  }     end; {{t menu<>nil #10}


{{ 44 f >>======>} {{FANTOM01:{LABEL} {{ #24}


{{ 45 fe  }     end; {{f HasShortCu #7}


Локалізація структурної помилки – не закритий цикл Repeat.


      program Presentation_graphics;


     {Si typedef.sys}


     begin


       InitGraphic;


       PlotPie;


       PlotBar;


       repeat untei KeyPressed;


       LeaveGraphic;


     end.


{{ www.grafor.pvt.ge PGF(Ver 1.3 activ 01.07.2009) FORMATTED 24. 5.2009/13:22 }


{{  1 }             program Presentation_graphics;


{{  2 }       


{{  3 }             {Si typedef.sys}


{{  4 PB }     begin {{ #11}


{{  5 }        InitGraphic;


{{  6 }        PlotPie;


{{  7 }        PlotBar;


{{  8 P  UB }     repeat untei KeyPressed; {{!ERROR!NO  #10}


{{  9 P  U  }        LeaveGraphic;


{{ 10 P  UE }     UNTIL !ERROR!NO UNT1L! {{U  #8}


{{ 11 PE }     end. {{P Presentati #4}

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*