Дана символьная строка A + B =  , здесь A и B – целые числа, а знак «+» обозначает какой-либо знак действия: знак суммы, знак разности или знак произведения. Требуется, чтобы машина вычислила это выражение и выдала результат — Pascal(Паскаль)

Цель данного «Интерпретатора»: расшифровать содержание введенной строки и  выполнить соответствующую арифметическую операцию.

Требования к данной программе:

  1. Операнды А и В могут быть многозначными целыми числами и не превышать допустимых значений.
  2. Между элементами строки, а также в начале и в конце ее могут  быть только пробелы.
  3. Программа должна осуществлять синтаксический и семантический контроль введенного выражения.
  4. При возникновении какой-либо ошибки, программа должна вывести причину ошибки.

Этап решения задачи.

  1. Ввести выражение.
  2. Проверить на наличие недопустимых символов, если такие есть, то выдать сообщение об ошибке.
  3. Проверка семантики и выделение операндов, знака действия.
    1. Выполнение выражения.

Планирование решения задачи.

Рисунок 1. Графическое планирование решения задачи.

         Итак, как показано на рисунке 1, с подпрограммой  Error (вывод сообщения об ошибке) связаны остальные подпрограммы, т.е. ошибки выполнения программы проверяются на каждом шаге ее выполнения.

Замечание: все подпрограммы записаны в виде процедур т.к. их более разумно использовать в данной программе.

Как работает процедура Error.

Задача данной процедуры очень проста – выдать сообщение, что произошла ошибка и выдать сообщение, какая произошла ошибка, а затем завершить работу программы.

Выбор нужного сообщения осуществляется оператором  выбора. Номер ошибки указывается в переменной e (типа byte).

Как работает процедура Read_w.

Задача этой процедуры – вывести сообщение, что нужно ввести выражение и осуществить ввод.

Как работает процедура Good_simvol.

Задача этой процедуры – проверить существуют ли недопустимые символы в введенном выражении или нет. Если хоть один такой символ есть, то происходит выполнение процедуры Error.

Проверка осуществляется простым перебором каждого символа введенного выражения. Для того, чтобы это осуществить, вводится новая переменная i (типа byte), которая в дальнейшем будет использоваться и другими процедурами.

Как работает процедура Good_stroka.

Задача этой процедуры – проверить семантику и нахождение операндов, знака действия. А также еще одна задача этой процедуры передать нужные параметры процедуре Calk и выполнить ее.

Семантика в процедуре как бы не заметна, она выполняется с помощью вывода ошибок. В процедуре в основном выполняется нахождение операндов и знака действия.

Алгоритм нахождения операндов и знака действия не очень сложный. После нахождения операндов и знака действия выполняется процедура Calk, в которую передаются параметры: <первый операнд>, <второй операнд> и <знак арифметической операции>.

Запуск программы.

После того как готовы эти процедуры, в основной программе нужно запустить три процедуры: Read_w, Good_simvol и Good_stroka.

Исходник программы «Интерпретатор».

{ ПРОГРАММА   ИНТЕРПРЕТАТОР }
uses crt;
var
e:byte;                 { номер ошибки }
st:string;              { вводимое выражение }
i:byte;                 { для цикла }

{ 0. **** Вывод сообщения об ошибке ****}
PROCEDURE error(var e:byte);
BEGIN
writeln(' Ну, что ты делаешь??? ОШИБКИ, сплошные ошибки!!!');
writeln;
case e of
1: writeln('Зачем, в выражении не понятные символы?? Я так не могу работать!');
2: begin
   writeln('Запомни, программу не обманешь! Точно скажу - в выражении нету');
   writeln('никаких знаков действия... Это...');
   end;
3: begin
   writeln('Запомни, программу не обманешь!');
   writeln('Знак равно кто ставить будет? В следующий раз не забудь его впихнуть!');
   end;
4: begin
   writeln('Интересно... ты наверное хочешь чтобы на компе сгорел процессор.');
   writeln('Попробуй вводить числа чуть, чуть поменьше.');
   end;
5: writeln('Интересно... Ты сам хоть решишь этот пример??????');
6: writeln('Не знаю как это получилось, но наверное числа тупые...');
end;
readln;
halt;
END;

{ 4. **** Выполнение выражения ****}
FUNCTION calk(var a,b:integer; s:char):longint;
BEGIN
case s of
'+': calk:=a+b;
'-': calk:=a-b;
'*': calk:=a*b;
end;
END;

{ 3. **** Проверка семантики и выделение операндов, знака действия ****}
PROCEDURE good_stroka;
var
d:char;
a_s,b_s:string;
o:word;
a,b:integer;
BEGIN
a_s:='';
b_s:='';
{ нахождение первого операнда }
i:=0;
repeat
inc(i);
if (st[i]>='0')and(st[i]<='9') then a_s:=a_s+st[i];
if i=length(st) then begin e:=2;error(e);end;
until (st[i]='+')or(st[i]='-')or(st[i]='*');
d:=st[i]; { сохранить знак действия }

{ нахождение второго операнда }
repeat
inc(i);
if (st[i]>='0')and(st[i]<='9') then b_s:=b_s+st[i];
if (i=length(st))and(st[i]<>'=') then begin e:=3;error(e);end;
until st[i]='=';

{ проверка операндов на допустимое значение }
if (length(a_s)>5)or(length(b_s)>5) then begin e:=4;error(e);end;
if (a_s='')or(b_s='') then begin e:=5;error(e);end;

{ преобразование операндов в число }
o:=0;
val(a_s,a,o);
if o<>0 then begin e:=6;error(e);end;
val(b_s,b,o);
if o<>0 then begin e:=6;error(e);end;

{ выполнение выражения }
writeln;
writeln;
write(a,' ',d,' ',b,' = ');
writeln(calk(a,b,d));
END;

{ 2. **** проверка на содержание других символов ****}
PROCEDURE good_simvol;
BEGIN
for i:=1 to length(st) do
 if ((st[i]>='0')and(st[i]<='9'))or(st[i]='+')or(st[i]='-')
 or(st[i]='*')or(st[i]='=')then else begin e:=1;error(e);end;
END;

{ 1. **** Ввод выражения ****}
PROCEDURE read_w;
BEGIN
write('Введите выражение: ');
st:='';
readln(st);
END;

BEGIN
clrscr;
read_w;
good_simvol;
good_stroka;
readln;
END.

Leave a Comment

7 + 3 =