|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Создание мини компилятора
не придумал как грамотнее назвать тему...
Идея такова...запускаем ехе,пишем код программы например в мемо и надо чтоб при нажатие батона этот код выполнился....так сказать компилятор... у кого ни будь есть ли какие идеи как это реализовать? |
#2
|
|||
|
|||
Код на каком языке писать собираетесь?
|
#3
|
||||
|
||||
Ну скорее это интерпрететатор, а не копилятор...
Типа как скрипты писать... А что писать в мемо будешь? В начале был Бит, потом Байт и только потом появилось Слово... |
#4
|
|||
|
|||
все собираюсь делать в delphi 7 ... в коде скорее всего будет обращение к компонентам уже расположенным на форме...язык паскаль соответсвенно
updated в кратце, динамическое создание компонентов, да математические вычисления |
#5
|
||||
|
||||
Все равно непонятно, приведи хоть малый пример кода который хотел бы вводить и опиши его результат...
P.S. Тебе нужен хороший парсер...А достать халявный так же как и написать свой сложновато... В начале был Бит, потом Байт и только потом появилось Слово... |
#6
|
|||
|
|||
у меня есть программка , в ней формируется код примерно такой
Код:
library aaaa; uses ShareMem,Windows, SysUtils, Classes, Forms,Dialogs, forma in 'forma.pas' {LAforma}; type TAutoState =( AUTO_H, AUTO_S1, AUTO_S2, AUTO_E); {$R *.res} function ShowForm(stroka: string) : Integer; var Form : TLAforma; dl,i,j,fl,zn,ind:integer; st,str,sInput:Shortstring; iState:TAutoState; begin Form := TLAforma.Create(Application); with Form do begin for i:=0 to 2 do for j:=1 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,j]:=' '; StringGrid1.Cells[0,0]:='№'; StringGrid1.Cells[1,0]:='Значение'; StringGrid1.Cells[2,0]:='Лексема'; ind:=1; sInput:=stroka; Edit2.Text:=sInput; sInput:=sInput+' '; dl:=Length(sInput); iState:=AUTO_H; fl:=0;zn:=0; for j:=1 to dl do begin st:=sInput[j]; case iState of AUTO_H: case sInput[j] of '-','0'..'9': begin iState:=AUTO_H;str:=str+st; end; '/': begin iState:=AUTO_S1;fl:=1;zn:=1;end; else begin iState:= AUTO_E;str:=str+st; end;end; AUTO_S1: case sInput[j] of '-','0'..'9': begin iState:=AUTO_S1;str:=str+st; end; ':': begin iState:=AUTO_S2;fl:=1;zn:=2;end; else begin iState:= AUTO_E;str:=str+st; end;end; AUTO_S2: case sInput[j] of '-','0'..'9': begin iState:=AUTO_S2;str:=str+st; end; '*': begin iState:=AUTO_H;fl:=1;zn:=3;end; else begin iState:= AUTO_E;str:=str+st; end;end; AUTO_E: begin if sInput[j]<>' ' then begin iState:=AUTO_E;str:=str+st;end else begin iState:=AUTO_H; showMessage('Ошибка распознавания: '+str);Memo1.Lines.Add(str);str:='';end;end;end; if fl=1 then begin StringGrid1.Cells[0,ind]:=IntToStr(ind); StringGrid1.Cells[1,ind]:=str; case zn of 1: begin StringGrid1.Cells[2,ind]:='Число'; end; 2: begin StringGrid1.Cells[2,ind]:='Месяц'; end; 3: begin StringGrid1.Cells[2,ind]:='Число'; end; end;str:='';ind:=ind+1;fl:=0; if ind=StringGrid1.RowCount then StringGrid1.RowCount:=StringGrid1.RowCount+1; end;end;end; Form.StringGrid1.RowCount:=Form.StringGrid1.RowCount-1; Result := Form.ShowModal;Form.Free;end; exports ShowForm; end. updated будет немного изменено это...будут создаваться некоторые компаненты динамически... updated 2 нашел вот еще что.... paxcompiler Последний раз редактировалось unmazable, 05.02.2010 в 14:24. |
#7
|
|||
|
|||
Любой компоенет с Pascal-скриптом позволит тебе это сделать легко и безболезненно. Есть FastScript (он платный, но исходники вполне можно найти в инете), есть что-то такое в RALib, есть еще куча подобных компонентов. Кроме того, можно работать с JScript'ом, ползуя интерпретатор IE.
|
#8
|
|||
|
|||
может пригодиться http://www.delphisources.ru/forum/sh...ad.php?t=10154
|
#9
|
||||
|
||||
Может немного и оффтоп, но всё же. Есть такая программка InnoSetup для создания инсталляторов. Язык скриптов у него и его возможности - именно такие как тебе нужны.
но вот хоть убей, не помню опэнсурс он или нет. Вроде да и ещё на офф сайте есть ссылка на проект, который посвящен написанию компилятора-интерпретатора. Гугл в помощь. Нет повести печальнее на свете, чем повесть о заклиневшем Resete. |
#10
|
|||
|
|||
Прикрути Lua и не мучайся.
|
#11
|
|||
|
|||
Цитата:
есть у меня исходник такого чуда. сам когда-то занимался этим. Всё позабывал... Поэтому хотелось бы повспоминать... А, забыл, на счёт исходника. Называется он BeRoTinyPascal Умеет много! Компилит сам себя(первоначальным компилем у меня был delphi 7)... Высылаю исходник. А кто бы хотел создать какой-нить свой компилятор, с уникальным синтаксисом, а не вечным повторением типа ASM->Basic->Pascal->C? Если есть желание, то давай пошаманим чё-нить? Для начала самое сложное - придемать синтаксис и логику выполнения. Кто за? |
#12
|
|||
|
|||
Ах да, чуть не забыл, вот писал как-то парсер мат. строки. Поддерживаются приоритеты операций и скобки.
Код:
program CalcParser; {$APPTYPE CONSOLE} type TypeTok = (number, plus, minus, emulation, divide, leftparent, rightparent, Stop); var Str: String; TypeToken: TypeTok; RealToken: real; StringToken: String; position: byte; procedure Expression(var x: real); forward; procedure Get; var e: integer; begin if position>length(Str) then begin TypeToken:=Stop; exit; end; StringToken:=''; while Str[position] in [' ', #9] do inc(position); case Str[position] of '0'..'9': begin while Str[position] in ['0'..'9'] do begin StringToken:=StringToken+Str[position]; inc(position); end; if Str[position]='.' then begin StringToken:=StringToken+Str[position]; inc(position); while Str[position] in ['0'..'9'] do begin StringToken:=StringToken+Str[position]; inc(position); end; end; TypeToken:=number; val(StringToken, RealToken, e); end; '+': begin TypeToken:=plus; inc(position); end; '-': begin TypeToken:=minus; inc(position); end; '*': begin TypeToken:=emulation; inc(position); end; '/': begin TypeToken:=divide; inc(position); end; '(': begin TypeToken:=leftparent; inc(position); end; ')': begin TypeToken:=rightparent; inc(position); end; else {error} end; end; procedure Factor(var x: real); begin case TypeToken of number: begin x:=RealToken; Get; end; leftparent: begin Get; Expression(x); if TypeToken=rightparent then Get else {error}; end; end; end; procedure Term(var x: real); var y: real; op: TypeTok; begin Factor(x); while TypeToken in [emulation, divide] do begin op:=TypeToken; Get; Factor(y); case op of emulation: x:=x*y; divide: x:=x/y; end; end; end; procedure Expression(var x: real); var y: real; op: TypeTok; begin Term(x); while TypeToken in [plus, minus] do begin op:=TypeToken; Get; Term(y); case op of plus: x:=x+y; minus: x:=x-y; end; end end; procedure init; begin StringToken:=''; RealToken:=0.0; position:=1; Get; end; var x: real; begin write('> '); readln(Str); while Str<>'' do begin init; Expression(x); writeln(' result = ', x:0:5); write('> '); readln(Str); end; end. компилировал на дельфах 7. Всё работало. |
#13
|
|||
|
|||
...пока разобрался только с FastScript , но не устраивает все время выскакивающий мессаг о том что надо зарегаться...а таких денег нет ...
Всем спасибо, буду пробовать вами предложенные варианты |