IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Интерпретатор, нужно сделать прогу на паскале
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Нужна прога на паскале-"Интерпретатор".
Может у кого -нибудь уже есть такая прога.
Или помогите советом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Интерпретатор чего имеется в виду? Чего интерпретировать должен?
Вот тут есть кое-что: Разбор и анализ строк
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 12.04.05 20:41)
Вот тут есть кое-что: Разбор и анализ строк


К сожалению там все проги написаны очень сложно для меня. Мне нужно сделать прогу-калькулятор: читает из файла текст,интерпретирует его и считает результат.Может кто-нибудь поможет сделать часть процедур.smile.gif
В принцепе они должны быть подобными...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(chessman @ 3.05.05 14:29)
К сожалению там все проги написаны очень сложно для меня.
В чем именно заключается сложность понимания тех программ?

Цитата(chessman @ 3.05.05 14:29)
Мне нужно сделать прогу-калькулятор: читает из файла текст,интерпретирует его и считает результат.
Ну, извините, это в две строчки и не уложишь, для написания такой программы необходимо хорошо знать динамические структуры данных (в частности - стеки и списки), по другому анализатор выражений просто не напишешь... И какая разница, будем писать мы или взять то, что уже написано. Принцип-то один...

Поэтому лучше выяснить непонятные места в программах, чем писать заново и получить то же самое (зато изобрести велосипед самому)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +



{
Ђ­ «Ё§ в®а/Є «мЄг«пв®а бва®ЄЁ :-)
 ‹ аоиЄЁ­ ћаЁ©. 2:5059/9.58
}
uses crt;
const fn=['a'..'z'];
     fn2=['*','/','+','_'];
     ch=['0'..'9','.','-'];

var s:string;

{ преобразует число в строковое представление
  с точностью 10 знаков }
function stt(e:extended):string;
var s:string;
begin
str(e:0:10,s);
stt:=s;
end;

{ обратное преобразование - преобразует строку
  в число типа extended }
function stt_(s:string):extended;
var q,w:extended;
i,j:integer;
begin
if pos ('.',s) = 0 then val (s,q,i) else
begin
if s[1]='-' then j:=-1 else j:=1;
val (copy(s,1,pos('.',s)-1),q,i);
val (copy(s,pos ('.',s)+1,byte(s[0])),w,i);
while w>1 do w:=w/10;
q:=j*(abs(q)+w);
end;
stt_:=q;
end;

{ в эту функцию передается простое выражение,
  НЕ содержащее скобок }
function clc (s:string):string;
var i,j,k,l:integer;
e:extended;

{ эта функция заменяет в простом выражении строковое
  представление одной операции (ее обозначение
  передается в строке C) на результат этой операции }
procedure clc_(c:string);
begin
while pos(c,s)<>0 do begin
i:=pos(c,s);k:=i; dec (i);
while (s[i] in ch) and (i>=1) do dec (i);
j:=k; inc (j);
while (s[j] in ch) and (j<=byte(s[0])) do inc (j);
case c[1] of
'+': s:=copy(s,1,i)+stt(stt_(copy (s,i+1,k-i-1))+stt_(copy(s,k+1,j-k-1)))+copy(s,j,byte(s[0]));
'_': s:=copy(s,1,i)+stt(stt_(copy (s,i+1,k-i-1))-stt_(copy(s,k+1,j-k-1)))+copy(s,j,byte(s[0]));
'*': s:=copy(s,1,i)+stt(stt_(copy (s,i+1,k-i-1))*stt_(copy(s,k+1,j-k-1)))+copy(s,j,byte(s[0]));
'/': s:=copy(s,1,i)+stt(stt_(copy (s,i+1,k-i-1))/stt_(copy(s,k+1,j-k-1)))+copy(s,j,byte(s[0]));
end;
s:=clc(s);
end;

end;

{ сама же функция проверяет, есть ли вхождения
  простых арифметических операций (* / + -), и заставляет
  вложенную ф-ю clc_ вычислять результаты операций
  согласно приоритету }
begin
if (pos('*',s)=0) and (pos('/',s)=0) and
(pos('+',s)=0) and (pos('_',s)=0) then clc:=s else begin
clc_('*'); clc_('/'); clc_('_'); clc_('+');
end;clc:=s;
end;

{ это - сердце программы. Эта ф-я ищет в строке с выражением
  обращение к функциям (sin, cos, ...), и выполняет эти функции.
  результат выполнения заносится в ту же строку вместо полного
  написания ф-ии }
function calc(s:string):string;
var i,j,k,l:integer;
s_,ss:string;
begin
for i:=1 to byte (s[0]) do begin
if (s[i]='-') and (s[i-1] in ch) then s[i]:='_';
if (s[i]='-') and (s[i-1] ='+') then s[i]:='_';
end;
calc:=s;
l:=byte (s[0]); i:=l;
if pos ('(',s)<>0 then begin
while (s[i]<>'(') and (i>1) do dec (i);
j:=i;
while (s[i]<>')') and (i<l) do inc (i);
if not(s[j-1] in fn) then begin
s:=copy (s,1,j-1)+(calc(copy(s,j+1,(i-j-1))))+copy (s,i+1,l);
s:=calc(s)
end else begin
s_:=calc(copy(s,j+1,(i-j-1)));
k:=j-1;
while (s[k] in fn) and (k>1) do dec (k);
ss:=copy (s,k+1,j-k-1);
randomize;

{ здесь в строке ss хранится название ф-ии которую необходимо выполнить,
  а в строке s_ - строковое представление аргумента.
  таким образом, имя ф-ии с агрументом просто "вырезается" из строки и
  заменяется результатом }

if ss='sin' then s:=copy (s,1,k)+stt(sin (stt_(s_)))+copy (s,i+1,l);
if ss='cos' then s:=copy (s,1,k)+stt(cos (stt_(s_)))+copy (s,i+1,l);
if ss='tg' then s:=copy (s,1,k)+stt(sin (stt_(s_))/cos (stt_(s_)))+copy (s,i+1,l);
if ss='atctg' then s:=copy (s,1,k)+stt(arctan (stt_(s_)))+copy (s,i+1,l);
if ss='ln' then s:=copy (s,1,k)+stt(ln (stt_(s_)))+copy (s,i+1,l);
if ss='abs' then s:=copy (s,1,k)+stt(abs (stt_(s_)))+copy (s,i+1,l);
if ss='rnd' then s:=copy (s,1,k)+stt(random (round(stt_(s_))))+copy (s,i+1,l);
if ss='exp' then s:=copy (s,1,k)+stt(exp (stt_(s_)))+copy (s,i+1,l);
s:=calc(s);
end; end;
calc:=clc(s);
end;

begin
clrscr;
s:='(34+((-45+56)*abs((54+6+sin(5)*10+46-38)*2)/46))/cos(111)';
writeln (s,'=',calc(s));
writeln(((34+((-45+56)*abs((54+6+sin(5)*10+46-38)*2)/46))/cos(111)):0:10);
end.

Вот собственно програмка,более-менее мне понятная.
Можно объяснить что делает каждая функция?Вообщем хотелось бы комментарии к проге.

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
chessman   Интерпретатор   12.04.2005 20:32
volvo   Интерпретатор чего имеется в виду? Чего интерпрети…   12.04.2005 20:41
chessman   Огромное спасибо! Я там нашел многое что мне …   12.04.2005 21:04
chessman   К сожалению там все проги написаны очень сложно …   3.05.2005 18:29
volvo   В чем именно заключается сложность понимания тех п…   3.05.2005 18:50
chessman   { Ђ­ «Ё§ в®а/Є «мЄг«пв®а бва®ЄЁ :-)  ‹ аоиЄЁ­ ћ…   3.05.2005 20:46
Atos   Поищи поиском по форуму, может быть здесь уже были…   12.04.2005 21:02
Atos   Если хочешь почитать теорию компиляторов, то завтр…   12.04.2005 21:06
Atos   См. присодинённые файлы. Первые две книжки по теор…   13.04.2005 8:40
chessman   Спасибо,но не могли бы выложить в .zip, с .rar п…   13.04.2005 14:51
volvo   chessman, скажи куда переслать (можно в приват ;) …   13.04.2005 14:58
volvo   К сожалению, у меня эта программа вылетает с переп…   3.05.2005 21:26
chessman   Может быть тогда посоветуете какую из предложенных…   3.05.2005 21:32
volvo   :no: Просто эта программа очень активно использует…   4.05.2005 0:53
chessman   Если эта программа работает,то можно к ней коммент…   4.05.2005 12:05
volvo   Общие комментарии добавлены. Для более детального …   4.05.2005 13:53
volvo   chessman, кстати эту программу можно немного упрос…   4.05.2005 16:33
Antonio   Обьясните пожалуйста программу   20.11.2005 14:50
volvo   To: Antonio Что именно в программе не понятно? Я …   20.11.2005 14:52
Antonio   После компиляции ничего не происходит!!…   20.11.2005 19:35
volvo   To: Antonio Хотелось бы напомнить, после компиляц…   20.11.2005 19:38
Antonio   Обьясните, как вводить новые выражения и получить …   20.11.2005 19:46
volvo   :blink: вообще-то так обычно делается... ... readl…   20.11.2005 20:25


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.05.2024 21:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name