Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.02.2010, 13:23
unmazable unmazable вне форума
Прохожий
 
Регистрация: 05.02.2010
Сообщения: 10
Репутация: 10
По умолчанию Создание мини компилятора

не придумал как грамотнее назвать тему...
Идея такова...запускаем ехе,пишем код программы например в мемо и надо чтоб при нажатие батона этот код выполнился....так сказать компилятор... у кого ни будь есть ли какие идеи как это реализовать?
Ответить с цитированием
  #2  
Старый 05.02.2010, 13:38
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Код на каком языке писать собираетесь?
Ответить с цитированием
  #3  
Старый 05.02.2010, 13:41
unmazable unmazable вне форума
Прохожий
 
Регистрация: 05.02.2010
Сообщения: 10
Репутация: 10
По умолчанию

все собираюсь делать в delphi 7 ... в коде скорее всего будет обращение к компонентам уже расположенным на форме...язык паскаль соответсвенно



updated
в кратце, динамическое создание компонентов, да математические вычисления
Ответить с цитированием
  #4  
Старый 05.02.2010, 14:13
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Все равно непонятно, приведи хоть малый пример кода который хотел бы вводить и опиши его результат...
P.S. Тебе нужен хороший парсер...А достать халявный так же как и написать свой сложновато...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #5  
Старый 05.02.2010, 14:20
unmazable unmazable вне форума
Прохожий
 
Регистрация: 05.02.2010
Сообщения: 10
Репутация: 10
По умолчанию

у меня есть программка , в ней формируется код примерно такой
Код:
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  
Старый 05.02.2010, 14:26
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Любой компоенет с Pascal-скриптом позволит тебе это сделать легко и безболезненно. Есть FastScript (он платный, но исходники вполне можно найти в инете), есть что-то такое в RALib, есть еще куча подобных компонентов. Кроме того, можно работать с JScript'ом, ползуя интерпретатор IE.
Ответить с цитированием
  #7  
Старый 05.02.2010, 13:40
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Ну скорее это интерпрететатор, а не копилятор...
Типа как скрипты писать...
А что писать в мемо будешь?
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #8  
Старый 09.02.2010, 12:50
= FFFFh = = FFFFh = вне форума
Прохожий
 
Регистрация: 07.02.2010
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от unmazable
не придумал как грамотнее назвать тему...
Идея такова...запускаем ехе,пишем код программы например в мемо и надо чтоб при нажатие батона этот код выполнился....так сказать компилятор... у кого ни будь есть ли какие идеи как это реализовать?

есть у меня исходник такого чуда. сам когда-то занимался этим. Всё позабывал... Поэтому хотелось бы повспоминать... А, забыл, на счёт исходника. Называется он BeRoTinyPascal Умеет много! Компилит сам себя(первоначальным компилем у меня был delphi 7)... Высылаю исходник.

А кто бы хотел создать какой-нить свой компилятор, с уникальным синтаксисом, а не вечным повторением типа ASM->Basic->Pascal->C?

Если есть желание, то давай пошаманим чё-нить? Для начала самое сложное - придемать синтаксис и логику выполнения. Кто за?
Вложения
Тип файла: zip BeRoPascal.zip (14.0 Кбайт, 48 просмотров)
Ответить с цитированием
  #9  
Старый 09.02.2010, 12:55
= FFFFh = = FFFFh = вне форума
Прохожий
 
Регистрация: 07.02.2010
Сообщения: 9
Репутация: 10
По умолчанию

Ах да, чуть не забыл, вот писал как-то парсер мат. строки. Поддерживаются приоритеты операций и скобки.

Код:
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  
Старый 10.02.2010, 08:14
unmazable unmazable вне форума
Прохожий
 
Регистрация: 05.02.2010
Сообщения: 10
Репутация: 10
По умолчанию

...пока разобрался только с FastScript , но не устраивает все время выскакивающий мессаг о том что надо зарегаться...а таких денег нет ...

Всем спасибо, буду пробовать вами предложенные варианты
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter