Форум: "Прочее";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
ВнизПостроение дерева исходного кода Найти похожие ветки
← →
xayam © (2007-04-02 10:37) [0]Есть такая идея, не знаю может быть уже кем-то реализованная, если да, то подскажите пожалуйста. Короче говоря сделать что-то типа языка xml для исходного кода паскаля.
Нашел такую же идею здесь - http://jeffrafter.com/samples/delphi/Pas2XML.zip , но реализованно не до конца (( и большей части исходников нет.
Скажем, имеем такой исходник
unit UMForm;
interface
uses
Windows, Forms, Dialogs, SysUtils, Classes, ActnList,
XPStyleActnCtrls, ActnMan, Menus, ActnPopup,
ImgList, Controls, CustomizeDlg, AppEvnts, Graphics,
JvBaseDlg, JvDesktopAlert, JvComponentBase, JvTrayIcon,
ActnCtrls, ToolWin, ActnMenus, ComCtrls, JvExComCtrls,
JvStatusBar, ExtCtrls, JvPageList, JvExControls, JvComponent,
FastMMUsageTracker, JvgProgress, SynEdit, SynMemo, Buttons, StdCtrls,
JvExStdCtrls, JvButton, JvCtrls, cxControls, cxSplitter, JvExExtCtrls,
JvSplitter;
type
TFD2h = class(TForm)
PageList: TJvPageList;
JvStandardPage1: TJvStandardPage;
JvStandardPage2: TJvStandardPage;
JvStandardPage3: TJvStandardPage;
JvStandardPage4: TJvStandardPage;
TrayIcon: TJvTrayIcon;
DlgAlert: TJvDesktopAlert;
ApplicationEvents: TApplicationEvents;
AMMenu: TActionMainMenuBar;
CustomizeDlg1: TCustomizeDlg;
AToolBar: TActionToolBar;
ILicons: TImageList;
APopupBar: TPopupActionBar;
TrayOptions: TMenuItem;
AManager: TActionManager;
acNew: TAction;
acOpen: TAction;
acSave: TAction;
acSaveAs: TAction;
acPrint: TAction;
acPreview: TAction;
acHelp: TAction;
acLicense: TAction;
acAboutProgram: TAction;
acFormating: TAction;
acExit: TAction;
acUndo: TAction;
acRedo: TAction;
acCut: TAction;
acCopy: TAction;
acPaste: TAction;
acDelete: TAction;
acSelectAll: TAction;
acFind: TAction;
acConvert: TAction;
acCreateArchive: TAction;
acCreateInstall: TAction;
acServerConnect: TAction;
acWizardPublic: TAction;
acButtons: TAction;
acButtonsShow: TAction;
acButtonsHide: TAction;
acFiles: TAction;
acView: TAction;
acPublication: TAction;
acOptions: TAction;
acExpand: TAction;
acCollapse: TAction;
acCreateFolder: TAction;
acFastMM: TAction;
acTBViewHand: TAction;
acTBViewPointer: TAction;
acCommandShow: TAction;
PanelCommand: TPanel;
MSynCommand: TSynMemo;
PanelComTop: TPanel;
BtnCommandClose: TJvImgBtn;
JvSplitter: TJvSplitter;
PProgress: TJvgProgress;
BtnClearCommand: TJvImgBtn;
EditCurrentDir: TEdit;
JvImgBtn1: TJvImgBtn;
acExecute: TAction;
EditCommand: TEdit;
JvSplitter1: TJvSplitter;
APopupCommand: TPopupActionBar;
acCopyCommand: TAction;
N12: TMenuItem;
acCreateProject: TAction;
acDeleteProject: TAction;
acPropertyProject: TAction;
acCreateFtp: TAction;
acDeleteFtp: TAction;
acPropertyFtp: TAction;
procedure FormShow(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure acAboutProgramExecute(Sender: TObject);
procedure acLicenseExecute(Sender: TObject);
procedure acHelpExecute(Sender: TObject);
procedure acExitExecute(Sender: TObject);
procedure acFilesExecute(Sender: TObject);
procedure TrayOptionsClick(Sender: TObject);
procedure acOpenExecute(Sender: TObject);
procedure acDeleteExecute(Sender: TObject);
procedure acSelectAllExecute(Sender: TObject);
procedure acButtonsShowExecute(Sender: TObject);
procedure acDeleteUpdate(Sender: TObject);
procedure acSelectAllUpdate(Sender: TObject);
procedure acButtonsUpdate(Sender: TObject);
procedure acExpandExecute(Sender: TObject);
procedure acExpandUpdate(Sender: TObject);
procedure acFastMMExecute(Sender: TObject);
procedure acTBViewPointerExecute(Sender: TObject);
procedure acTBViewHandExecute(Sender: TObject);
procedure acConvertExecute(Sender: TObject);
procedure acConvertUpdate(Sender: TObject);
procedure acCreateArchiveExecute(Sender: TObject);
procedure acCreateArchiveUpdate(Sender: TObject);
procedure acCommandShowExecute(Sender: TObject);
procedure BtnClearCommandClick(Sender: TObject);
procedure acExecuteExecute(Sender: TObject);
procedure acExecuteUpdate(Sender: TObject);
procedure EditCurrentDirKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure acCopyCommandExecute(Sender: TObject);
procedure acCopyCommandUpdate(Sender: TObject);
procedure acServerConnectExecute(Sender: TObject);
procedure acPropertyProjectExecute(Sender: TObject);
procedure acPropertyProjectUpdate(Sender: TObject);
procedure acPropertyFtpExecute(Sender: TObject);
procedure acPropertyFtpUpdate(Sender: TObject);
procedure acDeleteProjectExecute(Sender: TObject);
procedure acDeleteProjectUpdate(Sender: TObject);
procedure acCreateProjectExecute(Sender: TObject);
procedure acCreateProjectUpdate(Sender: TObject);
procedure acDeleteFtpExecute(Sender: TObject);
procedure acDeleteFtpUpdate(Sender: TObject);
procedure acCreateFtpExecute(Sender: TObject);
procedure acCreateFtpUpdate(Sender: TObject);
private { Private declarations }
procedure ChangeFFiles(const i: Integer);
public { Public declarations }
procedure ShowAlert(const S1, S2: String);
procedure AddCom(const S: String);
end;
← →
Суслик © (2007-04-02 10:39) [1]Не страдай ерундой
(по доброму сказал суслик)
← →
xayam © (2007-04-02 10:42) [2]нужно получить примерно так -
<p:Unit>
<p:Name>UMForm</p:Name>
<p:InterfaceSection>
<p:Uses>
<p:Name>Windows</p:Name>
<p:Name>Forms</p:Name>
<p:Name>Dialogs</p:Name>
<p:Name>SysUtils</p:Name>
<p:Name>Classes</p:Name>
<p:Name>ActnList</p:Name>
<p:Name>XPStyleActnCtrls</p:Name>
<p:Name>ActnMan</p:Name>
<p:Name>Menus</p:Name>
<p:Name>ActnPopup</p:Name>
<p:Name>ImgList</p:Name>
<p:Name>Controls</p:Name>
<p:Name>CustomizeDlg</p:Name>
<p:Name>AppEvnts</p:Name>
<p:Name>Graphics</p:Name>
<p:Name>JvBaseDlg</p:Name>
<p:Name>JvDesktopAlert</p:Name>
<p:Name>JvComponentBase</p:Name>
<p:Name>JvTrayIcon</p:Name>
<p:Name>ActnCtrls</p:Name>
<p:Name>ToolWin</p:Name>
<p:Name>ActnMenus</p:Name>
<p:Name>ComCtrls</p:Name>
<p:Name>JvExComCtrls</p:Name>
<p:Name>JvStatusBar</p:Name>
<p:Name>ExtCtrls</p:Name>
<p:Name>JvPageList</p:Name>
<p:Name>JvExControls</p:Name>
<p:Name>JvComponent</p:Name>
<p:Name>FastMMUsageTracker</p:Name>
<p:Name>JvgProgress</p:Name>
<p:Name>SynEdit</p:Name>
<p:Name>SynMemo</p:Name>
<p:Name>Buttons</p:Name>
<p:Name>StdCtrls</p:Name>
<p:Name>JvExStdCtrls</p:Name>
<p:Name>JvButton</p:Name>
<p:Name>JvCtrls</p:Name>
<p:Name>cxControls</p:Name>
<p:Name>cxSplitter</p:Name>
<p:Name>JvExExtCtrls</p:Name>
<p:Name>JvSplitter</p:Name>
</p:Uses>
<p:TypeSection>
<p:Class>
<p:Name>TFD2h</p:Name>
<p:Ancestor>TForm</p:Ancestor>
<p:Field>
<p:Name>PageList</p:Name>
<p:Type>TJvPageList</p:Type>
</p:Field>
<p:Field>
<p:Name>JvStandardPage1</p:Name>
<p:Type>TJvStandardPage</p:Type>
</p:Field>
<p:Field>
<p:Name>JvStandardPage2</p:Name>
<p:Type>TJvStandardPage</p:Type>
</p:Field>
<p:Field>
<p:Name>JvStandardPage3</p:Name>
<p:Type>TJvStandardPage</p:Type>
</p:Field>
<p:Field>
<p:Name>JvStandardPage4</p:Name>
<p:Type>TJvStandardPage</p:Type>
</p:Field>
<p:Field>
<p:Name>TrayIcon</p:Name>
<p:Type>TJvTrayIcon</p:Type>
</p:Field>
<p:Field>
<p:Name>DlgAlert</p:Name>
<p:Type>TJvDesktopAlert</p:Type>
</p:Field>
<p:Field>
<p:Name>ApplicationEvents</p:Name>
<p:Type>TApplicationEvents</p:Type>
</p:Field>
<p:Field>
<p:Name>AMMenu</p:Name>
<p:Type>TActionMainMenuBar</p:Type>
</p:Field>
<p:Field>
<p:Name>CustomizeDlg1</p:Name>
<p:Type>TCustomizeDlg</p:Type>
</p:Field>
<p:Field>
...
<p:Var>
<p:Name>glNewFtp</p:Name>
<p:Type>Boolean</p:Type>
<p:Value>False</p:Value>
</p:Var>
</p:VarSection>
</p:InterfaceSection>
</p:Unit>
← →
xayam © (2007-04-02 10:45) [3]но понятно для всего кода. Исходники такого сокровища вряд ли кто даст, даже если есть, подскажите хотя как можно это реализовать, через регулярные выражения по-моему очень сложно, и тормозить будет.
> Суслик © (02.04.07 10:39) [1]
> Не страдай ерундой
это не ерунда, это принципиально
← →
Kerk © (2007-04-02 10:52) [4]Поищи исходники colorer
← →
Игорь Шевченко © (2007-04-02 10:53) [5]
> Есть такая идея, не знаю может быть уже кем-то реализованная,
> если да, то подскажите пожалуйста. Короче говоря сделать
> что-то типа языка xml для исходного кода паскаля.
Вот если ты сделаешь перевод паскаля в Abstarct Syntax Tree это будет более интересно. Поищи парсеры паскаля, в том же GExperts есть
← →
Чапаев © (2007-04-02 11:03) [6]Такая хрень ([2]) есть в Delphi2005 и выше. Проджект, Опшнс, Компилер, Дженерейт КсыМыЛы документейшн.
← →
xayam © (2007-04-02 11:10) [7]
> Kerk © (02.04.07 10:52) [4]
> Поищи исходники colorer
http://colorer.sourceforge.net/
Так он на си)) Я его конечно в школе учил, но не настолько))
> Игорь Шевченко © (02.04.07 10:53) [5]
> это будет более интересно
безусловно, это очень универсальный подход, многие не понимают, что структурированная (и соответственно многоуровневая) информация представляет много большую ценность чем неструктурированная.
> Чапаев © (02.04.07 11:03) [6]
> Такая хрень ([2]) есть в Delphi2005 и выше. Проджект, Опшнс,
> Компилер, Дженерейт КсыМыЛы документейшн.
для ВСЕГО кода
← →
calm © (2007-04-02 11:14) [8]
> многие не понимают, что структурированная (и соответственно
> многоуровневая) информация представляет много большую ценность
> чем неструктурированная.
:)))
Практически никто не понимает, особенно программисты :)
← →
Игорь Шевченко © (2007-04-02 11:14) [9]Чапаев © (02.04.07 11:03) [6]
> Проджект, Опшнс, Компилер, Дженерейт КсыМыЛы документейшн
Это немного не то
← →
Чапаев © (2007-04-02 11:15) [10]> [9] Игорь Шевченко © (02.04.07 11:14)
Думал и о "том", только так и не придумал, какая от него практическая польза.
← →
Calm © (2007-04-02 11:17) [11]Ты дай знать, когда реализуешь.
Интересная задумка.
← →
xayam © (2007-04-02 11:18) [12]
> Чапаев © (02.04.07 11:15) [10]
> > [9] Игорь Шевченко © (02.04.07 11:14)
> Думал и о "том", только так и не придумал, какая от него
> практическая польза.
ну для начало - форматирование, подсветка, конвертирование в любой формат, документирование кода... Хватит?
← →
Ricko © (2007-04-02 11:21) [13]нет
← →
Игорь Шевченко © (2007-04-02 11:21) [14]xayam © (02.04.07 11:18) [12]
> ну для начало - форматирование, подсветка, конвертирование
> в любой формат, документирование кода...
Все эти действия очень легко и очевидно проделываются с Abstarct Syntax Tree.
← →
xayam © (2007-04-02 11:22) [15]
> Ricko © (02.04.07 11:21) [13]
> нет
+ схемы типа UML, EBNF, visio и т.д.
← →
Чапаев © (2007-04-02 11:28) [16]Цікаво... Надо будет поразмыслить. Заодно и в C# попрактиковаться...
← →
Игорь Шевченко © (2007-04-02 11:45) [17]
> многие не понимают, что структурированная (и соответственно
> многоуровневая) информация представляет много большую ценность
> чем неструктурированная
опять ты за старое
← →
xayam © (2007-04-02 11:47) [18]у меня все равно более универсальный подход чем любой xml))
← →
Думкин © (2007-04-02 11:51) [19]
> Скажем, имеем такой исходник
> unit UMForm;
Брррр. И надо было в качестве примера это чудовще приводить, за которое эцих с гвоздями пожизненный?
← →
Суслик © (2007-04-02 11:56) [20]ничего в ней интересного нет, кроме как на форуме пообщаться.
не сделашь ты этого - ибо компилятор постоянно развивается, причем парсинг его все более сложен.
ты же (автор, в смысле) фактически хочешь написать свой парсер.
← →
Игорь Шевченко © (2007-04-02 12:09) [21]Суслик © (02.04.07 11:56) [20]
Jedi сделал, GExperts сделали...
← →
Суслик © (2007-04-02 12:20) [22]
> [21] Игорь Шевченко © (02.04.07 12:09)
> Суслик © (02.04.07 11:56) [20]
>
> Jedi сделал, GExperts сделали...
тем более - зачем ерундой страдать, если сделано уже? :)
← →
Gydvin © (2007-04-02 13:18) [23]оффтоп
Кстати о парсерах. Может есть где исходники read and write парсера формата RTF? А то свой пишу, не зря ли?
/оффтоп
← →
celades © (2007-04-02 13:21) [24]
> для ВСЕГО кода
посмотри тут
http://www.devincook.com/goldparser/grammars/index.htm
есть грамматика для Delphi 7. К ней же и парсер есть. Осталось только синтаксическое дерево и генератор выхода.
← →
xayam © (2007-04-02 14:06) [25]
> celades ©
спасибо! это ближе))
http://www.devincook.com/goldparser/engine/delphi-rai/rai-delphi-project-tree-D5.zip
← →
pasha_golub © (2007-04-02 14:35) [26]
> celades © (02.04.07 13:21) [24]
Не получится. У Девина грамматика входная не терпит указания приоритетов операций, ассоциативности и прочее.
> xayam © (02.04.07 14:06) [25]
Есть у меня такой парсер. Строит дерево, но только для SQL. Сделан на DYACC (Delphi Yacc). Но само по себе дерево абсолютно бесполезно. Только для специфических общих задач. Если нужно будет что-то специализированное, то надо добавлять функциональсть к нодам (узлам).
← →
GrayFace © (2007-04-02 14:39) [27]А что из этих парсеров проще использовать для генерации кода на своем языке? А то есть безумная идейка сделать компилятор ERM на основе Дельфи...
← →
xayam © (2007-04-02 14:40) [28]
> pasha_golub © (02.04.07 14:35) [26]
> > celades © (02.04.07 13:21) [24]
> Не получится. У Девина грамматика входная не терпит указания
> приоритетов операций, ассоциативности и прочее.
а зачем мне приоритеты операций? ассоциативности чего?
← →
pasha_golub © (2007-04-02 14:40) [29]
> GrayFace © (02.04.07 14:39) [27]
>
> А что из этих парсеров проще использовать для генерации
> кода на своем языке? А то есть безумная идейка сделать компилятор
> ERM на основе Дельфи...
Поясните-ка с деталями.
← →
xayam © (2007-04-02 14:49) [30]
> pasha_golub © (02.04.07 14:35) [26]
> Но само по себе дерево абсолютно бесполезно.
Само по себе дерево содержит весь исходный код, да еще в упорядоченном виде. По Вашему весь исходный код бесполезен?
> Только для специфических общих задач. Если нужно
> будет что-то специализированное, то надо добавлять функциональсть
> к нодам (узлам).
нет. Для любых задач, связанных с исходных кодом. Но для этого одного знания xml мало, понадобится еще xlink, xpath, xquery, xslt, xsl-fo, xsd. Как минимум. Ничего не забыл?
← →
celades © (2007-04-02 14:50) [31]
> Не получится. У Девина грамматика входная не терпит указания
> приоритетов операций, ассоциативности и прочее.
Не понимаю о чем ты и что такое "Девин". Всё там хорошо и всё получится.
← →
pasha_golub © (2007-04-02 15:01) [32]
> xayam © (02.04.07 14:40) [28]
> а зачем мне приоритеты операций?
Например, имеем простенькую грамматику:%token NUM
%%
expr : expr ’+’ expr
| expr ’*’ expr
| ’(’ expr ’)’
| NUM
;
Она неоднозначна, ибо выражение вида a + b * c она может разобрать как
(a + b) * c либо a + (b * c).
Такую неоднозначность можно преодолеть двумя путями:
1. Переписать грамматику, например так:
%token NUM
%%
expr : term
| expr ’+’ term
;
term : factor
| term ’*’ factor
;
factor : ’(’ expr ’)’
| NUM
;
2. Явно указать приоритеты операций%token NUM
%left ’+’
%left ’*’
%%
expr : expr ’+’ expr
| expr ’*’ expr
| ’(’ expr ’)’
| NUM
;
В грамматиках Gold Parser"a можно использовать только второй вариант. Для приведенной в хелпе Delphi формальной грамматики Паскаля этого хватит. Но существует множество грамматик, в которых перкводить выражения очень громоздко.
← →
pasha_golub © (2007-04-02 15:02) [33]
> celades © (02.04.07 14:50) [31]
> Не понимаю о чем ты и что такое "Девин".
Девин Кук (Devin Cook) автор Gold Parser"a.
> Всё там хорошо и всё получится.
Тогда нет вопросов. :) Делайте
← →
pasha_golub © (2007-04-02 15:03) [34]
> xayam © (02.04.07 14:49) [30]
> Само по себе дерево содержит весь исходный код, да еще в
> упорядоченном виде. По Вашему весь исходный код бесполезен?
>
А что код в файле текстовом беспорядочен? :) Он тоже упорядочен. Есть у вас дерево, например, что вы с ним можете сделать?
← →
xayam © (2007-04-02 15:20) [35]
> pasha_golub © (02.04.07 15:01) [32]
да, но я не собираюсь писать компилятор, и мне без разницы КАК Вы будете обрабатывать дерево с исходным кодом, поэтому приоритеты операций не нужны.
> pasha_golub © (02.04.07 15:03) [34]
> Есть у вас дерево, например, что вы с ним можете сделать?
[12], [15]... этого мало? Посмотрите исходники SynEdit"а, если бы они подумали раньше и построили дерево, то выходных форматов было бы больше и кода для реализации было бы гораздо меньше))
← →
pasha_golub © (2007-04-02 15:20) [36]
> celades © (02.04.07 14:50) [31]
>
>
> > Не получится. У Девина грамматика входная не терпит указания
> > приоритетов операций, ассоциативности и прочее.
>
> Не понимаю о чем ты и что такое "Девин". Всё там хорошо
> и всё получится.
>
Вот глянь сюда:
http://www.devincook.com/goldparser/doc/meta-language/index.htmOperator precedence is an important aspect of most programming languages. The following rules define the common arithmetic operators.
<Expression> ::= <Expression> "+" <Mult Exp>
| <Expression> "-" <Mult Exp>
| <Mult Exp>
<Mult Exp> ::= <Mult Exp> "*" <Negate Exp>
| <Mult Exp> "/" <Negate Exp>
| <Negate Exp>
<Negate Exp> ::= "-" <Value>
| <Value>
<Value> ::= ID
| Integer
| "(" <Expression> ")"
То о чем я говорил. А если у меня 100 операций и все с разными приоритетами, то мне придется навернуть 100 правил, вместо одного.
И кстати, вернемся к примеру из 32 поста. Дерево разбора с использованием указания приоритета будет выглядеть так:
[+]
|- NUM
|- +
|- expr
|- NUM
|- *
|- NUM
А дерево разбора без указания приоритетов будет выглядеть так:
[+]
|- term
|- factor
|- NUM
|- +
|- expr
|- term
|- term
|- factor
|- NUM
|- *
|- factor
|- NUM
В деревьях мог порядок напутать, но смысл понятен.
← →
pasha_golub © (2007-04-02 15:23) [37]
> да, но я не собираюсь писать компилятор
Да, но вы не сможете разобрать то, что есть!
> Посмотрите исходники SynEdit"а, если бы они подумали раньше
> и построили дерево, то выходных форматов было бы больше
> и кода для реализации было бы гораздо меньше))
Я не думаю, что программисты SynEdit"а глупее, чем Вы и я. :) А вы думали над тем, что не все файлы можно разобрать. А задача подсветки синтаксиса работать даже не неверных данных, например
for i := 0 to 10 do
bedgin
...
end;
Парсер на этих входных данных не отработает, ибо у меня опечатка в слове begin. А подсветка отработать должна.
← →
xayam © (2007-04-02 15:27) [38]AddExpr> ::= <AddExpr> <AddOp> <MulExpr>
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<RefId> ::=
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--a
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<AddOp> ::= "+"
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--+
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<MulExpr> ::= <MulExpr> <MulOp> <Factor>
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<RefId> ::=
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--b
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<MulOp> ::= "*"
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--*
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--<RefId> ::=
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +--c
| | | | | | | | | | | | | | | | | | | | | | | | | | +--;
← →
pasha_golub © (2007-04-02 15:29) [39]
> xayam © (02.04.07 15:27) [38]
Используйте теги CODE
← →
xayam © (2007-04-02 15:29) [40]
> pasha_golub © (02.04.07 15:23) [37]
> Да, но вы не сможете разобрать то, что есть!
уже разобрал))
> А вы думали над тем, что не все файлы можно разобрать.
первым делом)) не разбираются - значит не компилируются. Так? А зачем мне такие исходники? ))
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Прочее";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.046 c