Реферат: Программирование на языках высокого уровня
New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est;
PEst^.p:=temp; goto lb; end;
IF (L^.s<Est^.s) and (Est=FEst) THEN begin
New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=FEst;
FEst:=temp; goto lb; end;
END ;
while Est<>nil do begin Write(Est^.s,'=',Est^.k,'; '); Est:=Est^.p; end;
ReadLn;
END.
END.
4 ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ
ТАБЛИЦА ТИПОВ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя типа | Тип | Назначение |
spisok | Динамическая переменная со структурой Recspisok | |
Recspisok | record | запись, содержащая переменную типа String (s) для хранения слова, переменную типа word (k) для хранения числа входов этого слова в тексте программы и ссылку (p). |
ТАБЛИЦА ПЕРЕМЕННЫХ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя | Тип | Назначение |
a | boolean | Признак конца слова |
b | boolean | Признак наличия текущего слова в списке L |
c | boolean | Признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION |
e | boolean | Признак считывания раздела программы, после встречи слова LABEL |
ch | char | Символы, которые считываются из текстового файла |
st | string | Переменная содержащая отдельное слово из текстового файла |
L | spisok | Указатель, содержащий адрес произвольного элемента списка L, который содержит все имена идентификаторов программы, а также число вхождений этих идентификаторов в программе |
Fst | spisok | Указатель, содержащий адрес первого элемента списка L |
Est | spisok | Указатель, содержащий адрес произвольного элемента списка Est, который содержит все имена идентификаторов программы в алфавитном порядке, а также числе вхождений идентификаторов в программе |
FEst | spisok | Указатель, содержащий адрес первого элемента списка Est |
PEst | spisok | Указатель, содержащий адрес произвольного элемента списка Est |
temp | spisok | Вспомогательный указатель, для записи адреса вспомогательного элемента списка |
f | text | Файловая переменная, содержащая текст программы |
Также в программе используется метка lb.
Идентификаторы в языке Pascal – это имена констант, переменных, меток, типов, процедур, функций и полей в записях. Идентификаторы могут состоять максимум из 63 символов. Идентификатор всегда начинается буквой, за которой могут следовать буквы и цифры, а также символ подчеркивания. Пробелы и специальные символы алфавита не могут входить в идентификатор.
Специальные символы:
+ - * / = ' . : ; < > [ ] ( ) { } ^ @ $ # ! ~ %
К специальным символам относятся также следующие пары символов:
<> <= >= := (* *) (. .)
Вначале программы указателю Fst присваивается значение nil. Этот указатель, содержит адрес первого элемента списка L, который будет содержать все имена идентификаторов программы, а также число вхождений идентификаторов в программе.
Далее программа печатает на экран строку "File >: ". После этого требуется ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу "Enter". Этот путь и имя файла считываются в переменную st. Далее файловая переменная f связывается с именем файла, содержащимся в переменной st, в результате обращения к стандартной процедуре ASSIGN. Далее программа инициирует файл для чтения с помощью стандартной процедуры RESET. При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, f будет указывать на начало файла, т. е. на компонент с порядковым номером 0. После этого переменной st присваиваем пустую строку.
Далее организуется цикл с помощью операторов REPEAT и UNTIL , который выполняется до тех пор пока переменная типа char сh не станет равной символу EOF (код #26). В этом цикле программа будет считывать символы из текстового файла и записывать их в переменную ch. Если перед выполнением чтения указатель файла достигнет конца очередной строки, то результатом чтения будет символ CR (код #13), а если достигнут конец файла, то – символ EOF (код #26). В результате работы этого цикла весь текстовый файл будет считан и сформирован список идентификаторов, а также число их вхождений в тексте программы на языке Pascal.
Вначале цикла указатель L, который имеет адрес произвольного элемента списка L, принимает значение указателя Fst. Затем переменным а (признак конца слова) и b (Признак наличия текущего слова в списке L) присваивается значение false. Далее с помощью стандартной процедуры READ из файловой переменной f считывается символ, на который указывает указатель файла, в переменную ch. В первом цикле это будет первый символ текстового файла. При помощи стандартной процедуры UPCASE программа из преобразует символы латинского алфавита от "а" до "z" в прописные буквы. Если же это прописная буква или любой другой символ, то в результате преобразования ничего не изменится.
Далее программа исключает слова, которые стоят между двумя одинарными кавычками. Чаще всего это текст, который печатается стандартной процедурой WRITE. Проверяется условие, если символ в переменной ch является символом " ' ", то тогда начинается цикл, образованный операторами REPEAT и UNTIL. В этом цикле программа считывает из файла в переменную ch символы до тех пор пока символ в переменной ch снова не будет равен символу " ' ". Далее цикл завершается, и переменная ch будет содержать символ " ' ".
Далее аналогичным способом программа исключает комментарии, встречающиеся в тексте программы, т. е. текст стоящий между двумя фигурными скобками. Проверяется условие, если символ в переменной ch является символом " { ", то тогда начинается цикл, образованный операторами REPEAT и UNTIL. В этом цикле программа считывает из файла в переменную ch символы до тех пор пока символ в переменной ch не станет равен символу " } ". Далее цикл завершается, и переменная ch будет содержать символ " } ".
Далее программа производит проверку символа в переменной ch и если он равен одному из символов: " ", '!', " ' ", "#", "$", "%", "&", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "@", "[", "], "\", "^", "`", "|", "~", "(", ")", код символа #10, код символа #13, "}", то это означает что слово в тексте, если оно было перед этими символами закончилось. И переменной a (признак конца слова) присваивается значение true. Если же символ в переменной ch не равен ни одному из этих символов, это означает, что это значащий символ, то переменная a останется равной false, и программа добавит этот символ в переменную st, содержащую текущее сформированное программой слово. Слово это будет содержаться в переменной строкового типа st. И если а будет равно true, то тогда начнется проверка этого слова. Если это окажется идентификатором, то оно запишется в список L, а если оно уже есть в списке, то тогда число вхождений этого слова в программе, которое содержится в этом же списке, увеличится на 1.
Если а равно true , то начинается блок программы, проверяющий текущее значение слова в переменной st.
1) Если переменная st содержит слово "BEGIN", то тогда переменным c (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение false, e (признак считывания раздела программы, после встречи слова LABEL) присваивается значение false.
2) Если переменная st содержит одно из слов: "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", то тогда переменным c (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение true, e (признак считывания раздела программы, после встречи слова LABEL) присваивается значение false, и переменной st присваивается пустая строка, т. к. она содержала одно из слов "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", а они не являются идентификаторами.