![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 для создания инсталляторов. Язык скриптов у него и его возможности - именно такие как тебе нужны.
но вот хоть убей, не помню опэнсурс он или нет. Вроде да ![]() и ещё на офф сайте есть ссылка на проект, который посвящен написанию компилятора-интерпретатора. Гугл в помощь. |
|
#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 , но не устраивает все время выскакивающий мессаг о том что надо зарегаться...а таких денег нет
...Всем спасибо, буду пробовать вами предложенные варианты |