Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» создание компилятора

Автор: Pinocchio
Дата сообщения: 26.03.2003 13:12
определения хорошо оформленного и состоятельного взяты из справочника.
Автор: zetnext
Дата сообщения: 28.03.2003 06:22
Я делаю такие операции над текстами с помощью perl скриптов. Редко бывало нужно превратить это в executable. Но если приходилось то помогает программа из ActiveState PDK (строго говоря она не бесплатная). Короче там есть опция сгенерировать standalone executable. То есть готовый exe будет запускаться на любой машинке где может и не быть установлен Perl.
Тут можно присобачить запуск скриптиков, как ты хотел, набранных вручную и через eval запускать их. Ошибки отлавливать и показывать юзеру.
Элементарный оконный юзер интерфейс можно сделать с помощью модулей Tk.
Автор: odl455
Дата сообщения: 28.03.2003 11:28
zetnext

Видимо я что-то не так объяснил. Меня понял только Guderian. Мне нужен действительно полнофункциональный компилятор, заточенный под мою конкретную задачу. Perl не подходит. Нет достаточного контроля ситуации на низком уровне. В частности нужна возможность например вырвнивать код по определённым адресам в памяти. Но в любом случае спасибо.
Автор: Guderian
Дата сообщения: 28.03.2003 12:02
odl455
Как успехи? Остановился на чем-то или пока в поисках?
Автор: odl455
Дата сообщения: 28.03.2003 13:25
Guderian

Следую совету 5 - "Копать в сторону yacc, lex,edg и иже с ними" и 6 "Взять сырцы какого-нибудь гнутого компилятора"

Читаю теорию пока. Информации довольно много.
Автор: Feg16
Дата сообщения: 20.04.2006 13:47
Присоединяюсь к вопросу. Конечно с бухты барахты компиль не напишешь, но хотеось бы знать от чего отталкиваться при создании исполняемого файла
Автор: OdesitVadim
Дата сообщения: 20.04.2006 14:56
От формата PE файла.
Автор: KADABRA
Дата сообщения: 20.04.2006 15:02


Цитата:
От формата PE файла.

Или формата ELF файла
Автор: Pinocchio
Дата сообщения: 21.04.2006 13:40

Цитата:
Для решения одной задачи встала задача создания собственного макро-языка. Нужна возможность создания макросов которые затем компилируются в бинарный код. Как к такой задаче подступиться?

От формата Лист Microsoft Excel, бинарнее не бывает.

Добавлено:
Макросы превращаемые в бинарный код могут зависеть от бинарного кода, тобишь какой тебе код нужен (для процессора или препроцессора, а может ещё для чего).
Почитал тут про оптимизацию размера программы, прога получилась на 200kb, любое количество маленьких экранчиков поверх телика. Делать её в один день можно.
Напоминаю:
1.Если нет каких компонентов - кнопка игноре.
2.Если текст не компилируется внимательно удаляем.
3.Если размеры экранчика не совпадают с размерами предметов используются первые два правила иначе не понять к чему я веду мысль.


Код: unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, MPlayer,
ExtCtrls, Menus, ComCtrls, PinClasses, PinValues, PinRegValues, pinShell,
XPMan;

type
TForm1 = class(TForm)
Exit1: TMenuItem;
File1: TMenuItem;
Link1: TPinRLink;
MediaPlayer1: TMediaPlayer;
N1: TMenuItem;
N11: TMenuItem;
N121: TMenuItem;
N15x11: TMenuItem;
New1: TMenuItem;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
PopupMenu1: TPopupMenu;
RegBoolean1: TPinRegBoolean;
RegistryValues1: TPinRegistryValues;
RegString1: TPinRegString;
Stayontop1: TMenuItem;
Timer1: TTimer;
TrackBar1: TTrackBar;
XPManifest1: TXPManifest;
Zoom1: TMenuItem;
procedure Exit1Click(Sender: TObject);
procedure File1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
procedure MediaPlayer1Notify(Sender: TObject);
procedure MediaPlayer1PostClick(Sender: TObject; Button: TMPBtnType);
procedure N11Click(Sender: TObject);
procedure N121Click(Sender: TObject);
procedure N15x11Click(Sender: TObject);
procedure New1Click(Sender: TObject);
procedure Panel1DblClick(Sender: TObject);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PopupMenu1Popup(Sender: TObject);
procedure Stayontop1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
private
fdrag: boolean;
fdx, fdy: Integer;
fk: Double;
fr: TRect;
public
procedure MOpen;
procedure MPlay;
end;

var
Form1: TForm1;

implementation

uses Types;

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.File1Click(Sender: TObject);
begin
OpenDialog1.InitialDir := ExtractFileDir(RegString1.Value);
if not OpenDialog1.Execute then exit;
Panel1.Caption := OpenDialog1.FileName;
RegString1.Value := Panel1.Caption;
MOpen;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if RegBoolean1.Value then FormStyle := fsStayOnTop;
fk := 1/2;
Panel1.Caption := RegString1.Value;
if FileExists(Panel1.Caption) then MOpen;
end;

procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
begin
if Button <> btPlay then exit;
MPlay;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
if MediaPlayer1.NotifyValue <> nvSuccessful then exit;
MediaPlayer1.Play;
end;

procedure TForm1.MediaPlayer1PostClick(Sender: TObject;
Button: TMPBtnType);
begin
if Button <> btPlay then exit;
TrackBar1.Max := MediaPlayer1.Length;
end;

procedure TForm1.MOpen;
begin
MediaPlayer1.Close;
fr.Right := 0;
Caption := ExtractFileName(Panel1.Caption);
Application.Title := Caption;
MediaPlayer1.FileName := Panel1.Caption;
MediaPlayer1.Visible := True;
MediaPlayer1.Open;
end;

procedure TForm1.MPlay;
var
R: TRect;
begin
if fr.Right = 0 then
fr := MediaPlayer1.DisplayRect;
if WindowState = wsMaximized then begin
R := Panel1.ClientRect;
end else begin
R := fr;
R.Right := Round(R.Right*fk);
R.Bottom := Round(R.Bottom*fk);
ClientWidth := R.Right;
ClientHeight := R.Bottom + TrackBar1.Height;
end;
MediaPlayer1.DisplayRect := R;
MediaPlayer1.Visible := false;
end;

procedure TForm1.N11Click(Sender: TObject);
begin
fk:=1; MPlay;
end;

procedure TForm1.N121Click(Sender: TObject);
begin
fk:=1/2; MPlay;
end;

procedure TForm1.N15x11Click(Sender: TObject);
begin
fk:=2/3; MPlay;
end;

procedure TForm1.New1Click(Sender: TObject);
begin
Link1.Link := ParamStr(0);
Link1.Run;
end;

procedure TForm1.Panel1DblClick(Sender: TObject);
begin
fdrag := false;
if WindowState <> wsMaximized then WindowState := wsMaximized
else WindowState := wsNormal;
MPlay;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fdrag := not (ssDouble in Shift) and (WindowState <> wsMaximized);
fdx := X; fdy := Y;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not fdrag then exit;
Y := fdy - Y; X := fdx - X;
Left := Left - X;
Top := Top - Y;
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fdrag := False;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
Stayontop1.Checked := FormStyle = fsStayOnTop;
end;

procedure TForm1.Stayontop1Click(Sender: TObject);
begin
MediaPlayer1.Display := nil;
try Sleep(10);
if FormStyle = fsStayOnTop then FormStyle := fsNormal
else FormStyle := fsStayOnTop;
RegBoolean1.Value := FormStyle = fsStayOnTop;
finally MediaPlayer1.Display := Panel1;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MediaPlayer1.Mode <> mpPlaying then exit;
TrackBar1.OnChange := nil;
try TrackBar1.Position := MediaPlayer1.Position;
finally TrackBar1.OnChange := TrackBar1Change;
end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
MediaPlayer1.Visible := true;
MediaPlayer1.Position := TrackBar1.Position;
end;

end.

object Form1: TForm1
Left = 40
Top = 128
BorderStyle = bsNone
Caption = 'Form1'
ClientHeight = 303
ClientWidth = 326
Color = clAppWorkSpace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OnCreate = FormCreate
object Panel1: TPanel
Left = 0
Top = 0
Width = 326
Height = 286
Align = alClient
PopupMenu = PopupMenu1
TabOrder = 0
OnDblClick = Panel1DblClick
OnMouseDown = Panel1MouseDown
OnMouseMove = Panel1MouseMove
OnMouseUp = Panel1MouseUp
end
object MediaPlayer1: TMediaPlayer
Left = 3
Top = 264
Width = 197
Height = 20
ColoredButtons = [btPlay, btPause, btStop, btNext, btPrev, btStep, btBack]
VisibleButtons = [btPlay, btPause, btStop, btNext, btPrev, btStep, btBack]
Anchors = [akLeft, akBottom]
Display = Panel1
TabOrder = 1
OnClick = MediaPlayer1Click
OnPostClick = MediaPlayer1PostClick
OnNotify = MediaPlayer1Notify
end
object TrackBar1: TTrackBar
Left = 0
Top = 286
Width = 326
Height = 17
Align = alBottom
PopupMenu = PopupMenu1
TabOrder = 2
ThumbLength = 14
OnChange = TrackBar1Change
end
object OpenDialog1: TOpenDialog
Left = 256
Top = 256
end
object PopupMenu1: TPopupMenu
OnPopup = PopupMenu1Popup
Left = 224
Top = 256
object File1: TMenuItem
Caption = 'File'
OnClick = File1Click
end
object Zoom1: TMenuItem
Caption = 'Zoom'
object N121: TMenuItem
Caption = '2x1'
OnClick = N121Click
end
object N15x11: TMenuItem
Caption = '1.5x1'
OnClick = N15x11Click
end
object N11: TMenuItem
Caption = '1x1'
OnClick = N11Click
end
end
object Stayontop1: TMenuItem
Caption = 'Stay on top'
OnClick = Stayontop1Click
end
object New1: TMenuItem
Caption = 'New'
OnClick = New1Click
end
object N1: TMenuItem
Caption = '-'
end
object Exit1: TMenuItem
Caption = 'Exit'
OnClick = Exit1Click
end
end
object Timer1: TTimer
Interval = 40
OnTimer = Timer1Timer
Left = 288
Top = 256
end
object RegistryValues1: TPinRegistryValues
ReadOnly = False
Relative = 'Software\Microsoft\Windows'
Left = 224
Top = 224
object RegBoolean1: TPinRegBoolean
Reg.ValueName = 'mplaytop'
end
object RegString1: TPinRegString
Reg.ValueName = 'mplaydir'
end
end
object XPManifest1: TXPManifest
Left = 256
Top = 224
end
object Link1: TPinRLink
Items = <>
Left = 288
Top = 224
end
end
Автор: Pinocchio
Дата сообщения: 24.04.2006 17:59
На случай если кого заинтересуют неясности про объявление одиночного документа, привожу материалл. Сам пока не в курсе для чего это.

Цитата:
объявление одиночного документа

Назначение
Объявляет одиночный документ.
Синтаксис EBNF
SDDecl ::= S 'Standalone' Eq (("'" ('yes' | 'no') "'")
| '"' ('yes' | 'no') '"'))
Стандартный синтаксис
[ ... ]Standalone={"|'}yes|no{"|'}
Аргументы
*    S представляет собой один или несколько разделяющих символов: знаков
пробела, перевода каретки, начала новой строки или табуляции (см. конструкцию S).
Синтаксис:
{[#х20|#x9|#xD|#хА][#х20|#x9|#xD
|#хА]...[#x20|#x9|#xD|#xA]}
*    Standalone представляет собой строку, указывающую на то, что далее следует
объявление одиночного документа.
*    Еq замещает знак равенства (=) с одним или несколькими предшествующими
и последующими пробелами (см. конструкцию Eq). Синтаксис: =
*    yes указывает на то, что внешние объявления разметки не ассоциированы с
текущим XML-документом; то есть документ не использует определение
DTD или оно включено во внутренний блок (часть DTD внутри документа-источника).
*    no указывает на то, что внешние объявления разметки могут быть ассоциированы
с текущим XML-документом. Это является значением по умолчанию, если какие-либо
внешние объявления разметки ассоциированы с документом.

Комментарии
SDDecl является компонентом конструкции XMLDecl.
Объявление разметки, на которое есть ссылка в объявлении одиночного документа,
находится либо во внешнем блоке (части DTD, находящейся в отдельном документе
вне текущего документа-источника), указанном в DTD, либо во внешней единице
параметра, указанной во внутреннем блоке (части DTD внутри документа-источника).
Объявление одиночного документа относится к внешним объявлениям, а не к внешним
единицам.
Наличие или отсутствие объявления одиночного документа не отражается на том,
является ли документ хорошо оформленным или состоятельным.
Если с ХМL-документом не ассоциированы элементы ExtSubsetDecl, XML-процессор
игнорирует объявление одиночного документа.
Чтобы XML-документ считался состоятельным, аргумент Standalone должен иметь
значение no, если элементы ExtSubsetDecl объявляют что-либо из следующего:
*    атрибуты со значением по умолчанию;
*    единицы (исключая &amp;, &apos;, &gt;, &lt; и &quot;);
*    атрибуты со значениями, которые могут быть нормализованы (то есть вся
разметка включается, а не минимизируется), что приведет к изменению значений;
*    типы элементов имеют содержание, если внутри элемента встречается
пропуск.
Не смешивайте одиночные и двойные кавычки; открывающая и закрывающая кавычки
вокруг одиночного значения в объявлении должны быть однотипными.

Пример
В следующем примере приводится объявление одиночного документа:
<?xml version="1.0" standalone="yes"?>
Родственные конструкции
Eq, S, XMLDecl.
Автор: Venk
Дата сообщения: 25.04.2006 15:20
Ахо и Ульмана читайте "Теория синтаксического анализа, перевода и компиляции"
Автор: diablist
Дата сообщения: 25.04.2006 17:16
Вот хорошая книга на русском.

"Пишем компилятор"
http://rapidshare.de/files/18901511/kompilator.cab.html
Автор: olannots
Дата сообщения: 21.03.2007 15:53
Здраствуйте.
Прочитал тему и подобные. Не нашел ответа на свой вопрос.
Надо написать простой компилятор Который будет обрабатывать циклы, условия, присваивания ну и конечно стандартные функции сложения и вычитания умножения и деления. Так же еще должен присутствовать синтаксический и лексический анализ.
Вопрос как??? Пробывал изучать некую книгу "Дракона" ничерта не понял.
Добрые люди пожалуйста помогите.
Автор: OdesitVadim
Дата сообщения: 21.03.2007 16:39
olannots

Цитата:
Пробывал изучать некую книгу "Дракона" ничерта не понял.

Ну так для неё надо быть готовым. А если базы нет, то и ничего и не будет понятно.
Настоятельно рекомендую прочитать книгу Креншоу "Давайте создадим компилятор". Последний раз ссылка была здесь http://proklondike.com/contentview.php?content=272
Написана очень чудным языком. Куча примеров. Создаётся своё подмножество паскаля.
Правда примеры написаны на паскале (для некоторых это может быть большим припятсвием, зачастую религиозным ).
Если будете систематически читать и пытаться делать, то что там написано, то через недельку вы легко будете писать парсеры арифметических выражений и операторов, конечно, если голова на месте
З.Ы. Знание ассемблера не просто приветствуються, а обязательно нужны. Но можно и обойтись, если компиляция будет происходить в промежуточный язык.
Автор: executor83
Дата сообщения: 31.03.2008 12:28
На SourceForge тма проектов на тему компилятор в исходных кодах. Можно взять какой нибудь за основу.
Автор: delover
Дата сообщения: 02.04.2008 15:17
executor83
А так же на форце лежит RemObject for Pascal Script, доступный как в www, так и в svn и группах новостей, хоть сейчас присоединяйся и пиши. Но тут более полезно знание английского языка, чем ассемблера. Ассемблер - это тупо. Более мощного скрипта не замечал.

olannots

Цитата:
Надо написать простой компилятор Который будет обрабатывать циклы, условия, присваивания ну и конечно стандартные функции сложения и вычитания умножения и деления.

Именно для этого вполне хватает именно паскаль скрипта. Программа начинает делать всю математику буквально за два-три дня. Всё что нужно - это правильно подсоединить и вызвать компоненты. А дальше думаешь только о том как твой текст правильно вставлять в шаблонный скрипт. У меня так формульные группы организованы.

Страницы: 12

Предыдущая тема: Хочу раскрасить одну строку в ListBox, StringGrid и т.д.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.