Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по курсовой по программированию.DOC
Скачиваний:
42
Добавлен:
20.05.2014
Размер:
586.75 Кб
Скачать

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 :=<номер ошибки >; Выход

все

конец

Выделение подпрограмм:

На основе анализа данного алгоритма можно выделить следующие подпрограммы:

  1. Обработка логического выражения – fle.

  2. Обработка оператора – fstatement.

  3. Пропуск пустых символов в 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.