- •Министерство образования и науки российской федерации
- •Оглавление
- •3. Содержание отчета
- •4. Задание на курсовую работу
- •4.1. Пример перевода
- •5. Постановка задачи
- •6. Внешняя спецификация программы
- •6.1. Вход
- •6.2. Выход
- •6.3. Аномалии
- •7. Метод решения задачи
- •8. Описание алгоритма
- •8.1. Структура данных
- •8.2. Алгоритм главной программы
- •8.3. Выделение подпрограмм
- •8.4. Алгоритм подпрограммы обработки комментария (fcomment)
- •8.5. Алгоритм подпрограммы обработки оператора if (fif)
- •8.6. Обработка арифметического выражения
- •9. Структура программы
- •10. Синтаксические диаграммы арифметических и логических выражений
- •11. Пример программы мини-транслятора на Паскале
- •12. Варианты индивидуальных заданий
- •13. Библиографический список
- •109028 Москва, б. Трехсвятительский пер., 3/12.
- •113054 Москва, ул. М. Пионерская, 12.
8.5. Алгоритм подпрограммы обработки оператора if (fif)
Дано:
text1 |
одномерный массив символьных строк, содержащий текст конвертируемой программы |
nstr1 |
номер строки массива text1, содержащей оператор |
npos1 |
номер первого символа после ключевого слова ifв текущей строке массива text1 |
nstr2 |
номер текущей строки в массиве text2 |
Требуется получить:
text2 |
одномерный массив символьных строк, содержащий текст программы, в который внесен оператор if |
nstr1 |
номер текущей строки массива text1 |
nstr2 |
номер текущей строки массива text2 |
npos1 |
номер первого символа после оператора ifв текущей строке массива text1 |
Fif |
номер диагностического сообщения в случае ошибки ( 0 - нет ошибки ) |
Связь
Синтаксис оператора ifна языке Паскаль и результат его трансляции на язык Си описаны в постановке задачи. Предполагается, что на момент входа в процедуру ключевое словоifво входном файле уже обработано вызывающей подпрограммой.
Алгоритмfif
начало
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
еслитекущий символ - открывающая скобкато
npos1:=npos1+1 (Пропуск вtext1 открывающей скобки)
Обработка логического выражения
еслиошибка в логическом выражениито
fif :=<номер ошибки>; Выход
все
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
еслитекущий символ - закрывающая скобкато
npos1:=npos1+1 (Пропуск вtext1 закрывающей скобки)
иначе
fif :=<номер ошибки >; Выход
все
все
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
еслиесть ключевое словоthen то
npos1:=npos1+4 ( Пропуск вtext1 словаthen)
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
иначе
fif :=<номер ошибки >; Выход
все
Обработка оператора
еслиошибка в операторето
fif :=<номер ошибки>; Выход
все
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
еслитекущее ключевое словоelse то
npos1:=npos1+4 ( Пропуск вtext1 словаelse)
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
Обработка оператора
еслиошибка в операторето
fif :=<номер ошибки>; Выход
все
все
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1
еслитекущий символ ‘;’то
npos1:=npos1+1
иначе
fif :=<номер ошибки >; Выход
все
конец
Выделение подпрограмм:
На основе анализа данного алгоритма можно выделить следующие подпрограммы:
Обработка логического выражения – fle.
Обработка оператора – fstatement.
Пропуск пустых символов в text1cсоответствующим увеличениемnpos1 –fpass.
8.6. Обработка арифметического выражения
Ниже приведена программа Recursi, иллюстрирующая использование рекурсии для проверки арифметического выражения. Алгоритм проверки строится на базе синтаксических диаграмм для варианта арифметического выражения ae3 (см. п. 1). Каждая диаграмма описывает некоторый синтаксический элемент арифметического выражения, которому в программе Recursi соответствует подпрограмма-функция, осуществляющая его проверку и возвращающая в качестве результата значениеTrueпри обнаружении ошибки илиFalseв противном случае. Связь диаграммы с подпрограммой можно представить следующим образом:
прямоугольник обозначает вызов подпрограммы проверки соответствующего элемента;
овал определяет символы, наличие которых в данном месте синтаксического элемента проверяется в подпрограмме (ключевые слова, знаки операций и т.д.);
дуги означают передачу управления (условный оператор или циклы).
Предполагается, что в правильном арифметическом выражении нет пустых символов. Программа Recursi может быть положена в основу подпрограммы конвертирования арифметического выражения.
programRecursi;
var
Ae : string[80]; {строка, содержащая арифметическое выражение; }
Pf : integer; {номер позиции текущего символа в строкеAe}
Flag : Boolean;
ch: char;
functionZnak:Boolean;{......................... функция проверки знака ................................}
begin
Znak := Ae[Pf] in ['+', '-'];
end;
function IsDigit(ch : Char) : Boolean; {......................... функция проверки цифры...............................}
begin
IsDigit := Ch in ['0'..'9'];
end;
functionIsAlpha(ch:Char) :Boolean;{........... функция проверки латинской буквы ......................}
begin
IsAlpha := Ch in ['A'..'Z','a'..'z'];
end;
function Fae : Boolean; forward;
function Fconst : Boolean; {........................функция проверки константы. ................................}
begin
Flag := True;
while (Pf <= Length(Ae)) and IsDigit(Ae[Pf]) do
begin
Inc(Pf); Flag := False;
end;
if Ae[Pf] = '.' then
begin
Inc(Pf);
while (Pf <= Length(Ae)) and IsDigit(Ae[Pf]) do
begin
Inc(Pf); Flag := False;
end;
end;
if Flag then
begin
Fconst := True; Exit;
end;
if Ae[Pf] = 'E' then
begin
Inc(Pf);
if Znak then Inc(Pf);
if not IsDigit(Ae[Pf]) then
begin
Fconst := True; Exit;
end;
while (Pf <= Length(Ae)) and IsDigit(Ae[Pf]) do Inc(Pf);
end;
Fconst := False;
end;
functionFid:Boolean;{........................... функция проверки идентификатора..............................}
begin
if (Pf <= Length(Ae)) and not IsAlpha(Ae[Pf]) then
begin
Fid := True; Exit;
end;
while (Pf <= Length(Ae)) and (IsAlpha(Ae[Pf]) or IsDigit(Ae[Pf])) do Inc(Pf);
Fid := False;
end;
functionFper:Boolean;{........................... функция проверки переменной..............................}
begin
if Fid then
begin
Fper := True; Exit;
end;
if Ae[Pf] = '[' then
begin
repeat
Inc(Pf);
if Fae then
begin
Fper := True; Exit;
end;
until (Ae[Pf] <> ',');
if Ae[Pf] <> ']' then
begin
Fper := True; Exit;
end;
Inc(Pf);
end;
Fper := False;
end;
functionFmnog:Boolean;{........................... функция проверки множителя..............................}
begin
if Ae[Pf] = '(' then
begin
Inc(Pf);
if Fae then
begin
Fmnog := True; Exit;
end;
if Ae[Pf] = ')' then
Inc(Pf)
else
begin
Fmnog := True; Exit;
end
end
else
if Fper and Fconst then
begin
Fmnog := True; Exit;
end;
Fmnog := False ;
end;
functionFslag:Boolean; {.......................... функция проверки слагаемого ...............................}
begin
while True do
if Fmnog then
begin
Fslag := True; Exit;
end
else
if (Ae[Pf] = '*') or (Ae[Pf] = '/') then
Inc(Pf)
else
begin
Fslag := False; Exit;
end
end;
functionFae:Boolean;{........................... функция проверки выражения..............................}
begin
if Znak then Inc(Pf);
while True do
begin
if Fslag then
begin
Fae := True; Exit;
end;
if Znak then
Inc(Pf)
else
begin
Fae := False; Exit;
end;
end;
end;
begin{........................... начало программы .............................}
writeln('Введите строку арифметического выражения:'); readln(Ae);
Pf := 1;
if Fae or (Pf <= Length(Ae)) then
writeln('Ошибка в позиции ', Pf)
else
writeln('Правильно !');
ch:=Readkey;
end.