Программирование на языках высокого уровня
|
|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", а они не являются
идентификаторами.
3) Если переменная st содержит слово "LABEL", то тогда переменным c
(признак считывания раздела программы, после встречи слов: TYPE, VAR,
CONST, PROCEDURE, FUNCTION) присваивается значение false, e (признак
считывания раздела программы, после встречи слова LABEL) присваивается
значение true, и переменной st присваивается пустая строка, т. к. она
содержала слово "LABEL", а оно не являетя идентификатором.
4) Если переменная st содержит одно из слов: "AND", "XOR", "NOT", "OR",
"DIV", "MOD", "SHL", "SHR", "NIL", "OBJECT", "ARRAY", "FILE", "OF",
"RECORD", "SET", "BYTE", "SHORTINT", "WORD", "INTEGER", "LONGINT",
"STRING", "BOOLEAN", "REAL", "DOUBLE", "EXTENDED", "COMP", "CHAR", "END",
"TEXT", то переменной st присваивается пустая строка, т. к. она содержала
одно из этих слов, а оно не является идентификатором.
5) Если переменные с (признак считывания раздела программы, после
встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно true, e (признак
считывания раздела программы, после встречи слова LABEL) равно false, что
соответствует разделу описательной части программы, и не разделу описания
меток, и первый символ в строке равен цифре, то тогда переменной st
присваивается пустая строка, т. к. она содержит слово, находящееся в
описательной части программы и начинающееся с цифры, т. е. цифру. А цифры в
описательной части программы, если они не являются метками, то и не
являются идентификаторами.
6) Если переменные с (признак считывания раздела программы, после
встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно false, e
(признак считывания раздела программы, после встречи слова LABEL) равно
false, что соответствует разделу программы стоящей между словами BEGIN и
END, и первый символ в строке равен цифре, а текущее значение переменной ch
не равно символу " : ", то тогда переменной st присваивается пустая строка,
т. к. она содержит слово, находящееся в части программы, стоящей между
словами BEGIN END, и начинающееся с цифры, т. е. цифру. А цифры в части
программы, стоящей между словами BEGIN END, после которых не стоит символ "
: " не являются метками и не являются идентификаторами.
7) С помощью оператора WHILE образуется цикл: в то время как указатель
L не равен значению nil, то есть список L уже содержит какие-то слова из
текста программы и число вхождений каждого из этих слов, и переменная st не
равна пустой строке проверяется условие. Если значение в поле s
динамической переменной структуры Recspisok, адрес которой содержится в
указателе L равно слову содержащемуся в переменной st, то выполняется
следующие действия. Значению в поле k динамической переменной структуры
Recspisok, адрес которой содержится
| | скачать работу |
Программирование на языках высокого уровня |