Рефераты. Программно-методический комплекс для обучения процессу создания компиляторов

Таблица 8 – Таблица литералов

Специф

Литерал

Тип

Размер в памяти

1

10

INTEGER

2


Таблица содержит следующие поля:

Специф – спецификатор, определяет положение идентификатора в таблице;

Литерал  – значение литерала, найденного в тексте программы;

Тип – тип распознанного литерала;

Размер в памяти – размер литерала, занимаемый в памяти, определяется в зависимости от типа;

Относительный адрес в памяти – адрес относительно начала объявления переменных, формируется в зависимости от размера памяти занимаемой литералами и идентификаторами.

Таблица служит для хранения литералов, найденных в тексте программы. После внесения литерала в таблицу, в таблицу выходных кодов лексем заносится номер таблицы (№3) и спецификатор найденного элемента.


2.3.4 Работа сканера



Работа сканера LEXAN происходит следующим образом. Студент в соответствующее поле пишет (или загружает из файла через меню) текст программы. Далее выбираются терминальные символы, необходимые для разбора текста программы и на основе правил разбора заполняются таблицы символических имен, литералов и выходных кодов лексем. После этого производится проверка правильности заполнения. При этом программа производит анализ текста и заполняет свои внутренние соответствующие таблицы и сравнивает с данными, полученными от студента и, при наличии ошибки, генерирует сообщения в поле сообщений. При необходимости можно получить листинг. Также можно сохранить результаты в файл для передачи данных на следующий этап – синтаксический анализ.




2.3.5 Структура листинга



Листинг включает в себя текст программы, все таблицы с заполненными студентом данными и все сообщения об ошибках.




2.3.6 Структура выходного файла



Выходной файл хранит в себе все 4 таблицы, построчно храня каждую ячейку. Это позволяет не ограничивать длину идентификаторов и ключевых слов. Вначале файла также построчно указываются размеры таблиц, сначала выбранных терминальных символов (число столбцов, число строк), затем символических имен, литералов и, наконец, выходных кодов лексем (только число столбцов). Структура промежуточного файла показана в таблице 9.


Таблица 9 – Пример промежуточного файла

№ строки

Содержи-мое

Описание содержимого

1

5

4 столбца + 1 (четвертый) зарезервирован

2

7

1 строка – заголовок таблицы, последующие 6 – строки с данными

3

5

5 столбцов

4

4

1 строка – заголовок таблицы, последующие 3 – строки с данными

5

5

5 столбцов

6

3

1 строка – заголовок таблицы, последующие 2 – строки с данными

7

16

1 столбец – описания, остальные 15 – с данными

(в таблице три строки)

8


данные из таблицы 1 по ячейкам, следуют слева направо (построчно), сверху вниз.


7+5*7=42


43


данные из таблицы 2 по ячейкам, следуют слева направо (построчно), сверху вниз.


42+5*4=62


63


данные из таблицы 3 по ячейкам, следуют слева направо (построчно), сверху вниз.


62+5*3=77


78


данные из таблицы 4 по ячейкам, следуют сверху вниз (по столбцам), слева направо.


77+16*3=125



В качестве примера приводится пример разбора задания, описанного в приложении А.




2.3.7 Примерное задание для студента



Дана некоторая грамматика языка:

1.     <prog>             ::= PROGRAM <prog-name> VAR <dec-list> BEGIN <stmt-list> END.

2.     <prog-name>    ::= id

3.     <dec-list>         ::= <dec> | <dec-list> ; <dec>

4.     <dec>              ::= <id-list> : <type>

5.     <type>             ::= INTEGER

6.     <id-list>            ::= id | <id-list> , id

7.     <stmt-list>        ::= <stmt> | <stmt-list> ; <stmt>

8.     <stmt>             ::= <assign> | <for>

9.     <assign>           ::= id := <exp>

10. <exp>              ::= <term> | <exp> + <term> | <exp> - <term>

11. <term>             ::= id | int | ( <exp> )

12. <for>               ::= FOR <index-exp> DO <body>

13. <index-exp>     ::= id := <exp> TO <exp>

14. <body>            ::= <stmt> | BEGIN <begin-list> END


Используя программу LEXAN произвести следующие действия:

1.     Заполнить таблицу терминальных символов (таблица 1);

2.     Написать исходный текст на учебном языке с использованием заданной грамматики;

3.     Заполнить таблицы:  –   символьных имен (таблица 2);

–       литералов (таблица 3);

–       лексического анализа (выходных символов);

4.     Проверить правильность заполнения таблиц встроенным анализатором;

5.     При наличии ошибок исправить имеющиеся, и повторно обработать программой LEXAN;

6.     Получить листинг полученных результатов;

7.     Сохранить результат в файл.


Пример выполнения приведен в приложении А.




2.3.8 Описание работы лексического анализатора



После того как студент написал программу или загрузил ее из файла, также заполнил все таблицы и запустил программу на проверку, программа начинает выполнять следующее.

Программа производит чтение первого символа, далее производятся проверки.

-         Если считанный символ является буквой или знаком подчеркивания «_», если да, то это либо ключевое слово, либо идентификатор. Далее считывается следующий символ (литера) и производится его проверка, входит ли этот символ во множество букв русского и латинского алфавитов, цифр, является ли он символом подчеркивания, если да, то полученный символ добавляется к строковой переменной, формирующей лексему. Дальнейшее считывание и обработка происходит до тех пор, пока не встретится какой либо другой символ.

-         Если считанный символ является цифрой, то далее происходит проверка, является ли следующий символ цифрой или точкой. Если полученная литера состоит из одних цифр, то полученное число целого (INTEGER) типа, если в литере есть точка, то число вещественного (REAL) типа.

-         Если считанный символ – одинарная кавычка, то текст, следующий за ней до следующей одинарной кавычки, будет являться строковой константой, а знаки кавычек будут определены как специальные символы.

-         Если считанный символ является знаком «{», то сам знак и следующие за ним символы до знака «}» включительно игнорируются, так как являются комментарием.

-         Если считанный символ является специальным символом, происходит проверка, является ли данный символ сдвоенным и проверяется второй символ. Если второй символ не образует пару или первый из двух найденных является одинарным, то происходит обработка данного терминального символа, поиск его кода.

После распознавания лексемы происходит заполнение таблиц, соответствующих типу лексемы. Если предполагается, что полученная лексема является терминальным символом, то происходит перебор всех значений таблицы терминальных символов. В случае, когда лексема найдена, необходимо получить ее код и заполнить соответствующим образом таблицу выходных кодов лексем. В случае, когда лексема не найдена предполагается, что лексема является идентификатором. Происходит поиск по таблице символьных имен. В случае, когда в таблице такая лексема уже имеется, происходит заполнение таблицы выходных кодов лексем, иначе лексема включается в таблицу и также заполняется таблица кодов лексем.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.