![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 не придумал как грамотнее назвать тему... 
		
	
		
		
		
		
		
	
		
		
	
	
	Идея такова...запускаем ехе,пишем код программы например в мемо и надо чтоб при нажатие батона этот код выполнился....так сказать компилятор... у кого ни будь есть ли какие идеи как это реализовать?  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код на каком языке писать собираетесь? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 все собираюсь делать в delphi 7 ... в коде скорее всего будет обращение к компонентам уже расположенным на форме...язык паскаль соответсвенно 
		
	
		
		
		
		
		
	
		
		
	
	
	updated в кратце, динамическое создание компонентов, да математические вычисления  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Все равно непонятно, приведи хоть малый пример кода который хотел бы вводить и опиши его результат... 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	P.S. Тебе нужен хороший парсер...А достать халявный так же как и написать свой сложновато...  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 у меня есть программка , в ней формируется код примерно такой 
		
	
		
		
		
		
		
		
			Код: 
	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.  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Любой компоенет с Pascal-скриптом позволит тебе это сделать легко и безболезненно. Есть FastScript (он платный, но исходники вполне можно найти в инете), есть что-то такое в RALib, есть еще куча подобных компонентов. Кроме того, можно работать с JScript'ом, ползуя интерпретатор IE. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Ну скорее это интерпрететатор, а не копилятор... 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Типа как скрипты писать... А что писать в мемо будешь?  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 есть у меня исходник такого чуда. сам когда-то занимался этим. Всё позабывал... Поэтому хотелось бы повспоминать... А, забыл, на счёт исходника. Называется он BeRoTinyPascal Умеет много! Компилит сам себя(первоначальным компилем у меня был delphi 7)... Высылаю исходник. А кто бы хотел создать какой-нить свой компилятор, с уникальным синтаксисом, а не вечным повторением типа ASM->Basic->Pascal->C? Если есть желание, то давай пошаманим чё-нить? Для начала самое сложное - придемать синтаксис и логику выполнения. Кто за?  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ах да, чуть не забыл, вот писал как-то парсер мат. строки. Поддерживаются приоритеты операций  и скобки. 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	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. Всё работало.  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 ...пока разобрался только с FastScript , но не устраивает все время выскакивающий мессаг о том что надо зарегаться...а таких денег нет  
		
	
		
		
		
		
		
	
		
		
	
	
	 ...Всем спасибо, буду пробовать вами предложенные варианты  |