Используя стек, проверить правильность вложений операторных скобок (begin - end) в программе на Паскале - Free Pascal
Формулировка задачи:
В файле находится текст программы на Паскале. Используя стек, проверить правильность вложений операторных скобок (begin - end) в этой программе.
Решение задачи: «Используя стек, проверить правильность вложений операторных скобок (begin - end) в программе на Паскале»
textual
Листинг программы
type stack = record
data : array [0..100000] of char;
size : longint;
end;
var
Myst : stack;
i : longint;
fin, fout : text;
tmp : char;
line, row : longint;
Flag : boolean;
procedure push(ch : char; var st : stack);
begin
inc(st.size);
st.data[st.size] := ch;
end;
function isempty(st : stack) : boolean;
begin
if (st.size = 0) then
isempty := true
else
isempty := false;
end;
procedure pop(var st : stack);
begin
if(NOT isempty(st)) then begin
st.data[st.size] := ' ';
dec(st.size);
end else
writeln('Stack is empty!');
end;
procedure OpenFileIn(var f : text);
var
NameF : string;
begin
write('Введите название проверяемого файла');
readln(NameF);
assign(f, NameF);
reset(f);
end;
procedure OpenFileOut(var f : text);
var
NameF : string;
begin
NameF := 'result.txt';
writeln('Результат в файле: ',NameF);
assign(f, NameF);
rewrite(f);
end;
function compare(ch : char) : boolean;
begin
if (ch = '(') or (ch = '[') or (ch = '{') then
push(ch, Myst)
else begin
if(ch = ')') then
if (Myst.data[Myst.size] = '(') then
pop(Myst)
else
compare := false;
if(ch = ']') then
if (Myst.data[Myst.size] = '[') then
pop(Myst)
else
compare := false;
if(ch = '}') then
if (Myst.data[Myst.size] = '{') then
pop(Myst)
else
compare := false;
end;
end;
BEGIN
row := 1;
line := 1;
Flag := true;
OpenFileIn(fin);
while (NOT EOF(fin)) do begin
while(NOT EOLn(fin)) do begin
read(fin, tmp);
Flag := compare(tmp);
if (Flag = false) then begin
OpenFileOut(fout);
writeln(fout, 'Error: ', line, ' ', row);
close(fout);
exit();
end;
inc(row);
end;
readln(fin);
row := 1;
inc(line);
end;
OpenFileOut(fout);
if (isempty(Myst)) then
writeln(fout, 'No errors!')
else
writeln(fout, 'Not enough of closing brackets');
Close(fout);
Close(fin);
END.
Объяснение кода листинга программы
- Тип данных переменной
Myst— stack (стек), она содержит массив символов и счетчик размера. - Вложенные функции и процедуры:
a. Push — добавляет символ в стек.
b. Isempty — проверяет, пуст ли стек.
c. Pop — удаляет и возвращает последний добавленный в стек символ (предполагая, что стек не пуст).
d. OpenFileIn — открывает файл для чтения и сохраняет его имя в переменной
f. e. OpenFileOut — открывает файл для записи и сохраняет его имя в переменнойf. f. Compare — сравнивает последний символ в стеке со введенным символом и, если необходимо, удаляет соответствующие скобки из стека. - Основная программа: a. Создает файл для записи результатов. b. Открывает файл для чтения и начинает его обрабатывать построчно. c. Проверяет каждый символ в строке на соответствие скобкам '(' и ')', '[' и ']', '{ и }'. d. Если символ не соответствует, записывает информацию об ошибке в файл результатов и выводит сообщение об ошибке. e. Если все символы проверены и ошибок не найдено, выводит сообщение об успешном завершении.