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




Реферат на тему

текст обсуждение файлы править категориядобавить материалпродать работу




Диплом на тему Программно методический комплекс для обучения процессу создания компиляторов

скачать

Найти другие подобные рефераты.

Диплом *
Размер: 209.36 кб.
Язык: русский
Разместил (а): Кузнецов Александр Иванович
Предыдущая страница 1 2 3 4 5 6 7 8 9 10 Следующая страница

добавить материал

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

2.2 Описание учебного языка

 
Учебный язык построен на основе языка Паскаль.
Алфавит учебном языка включает буквы, цифры, специальные символы и зарегистрированные слова.
Буквы – это буквы латинского алфавита от а до я, от А до Я, от a до z и от A до Z. В данном языке нет различия между прописными и строчными буквами алфавита, если только они не входят в символьные и строковые выражения.
Цифры – арабские цифры от 0 до 9.
Специальные знаки учебного языка – это символы:
+  -  *  /  =  ,  .  :  ;  <  >  {  }  [  ]  (  )
К специальным знакам также относятся следующие пары символов:
<>  <=  >=  :=
в программе эти символы нельзя разделять пробелами, если они используются как знаки операций отношения.
Особое место в алфавите языка занимают пробелы. Эти символы рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов. Несколько следующих друг за другом пробелов считаются одним пробелом.
В учебном языке имеются следующие зарезервированные слова:

and
begin
div
do
downto
else
end
for
function
if
integer
procedure
program
real
repeat
string
then
to
until
var
while
write
read

 
Их можно изменять при построении компилятора в соответствующей программной среде LEXAN.
Идентификаторы – имена переменных, процедур, функций, программ. Длина идентификатора ограничена 255 символами. Идентификатор всегда начинается буквой или знаком подчеркивания, за которым могут следовать буквы, цифры и знак подчеркивания. Пробелы и специальные символы не могут входить в идентификатор.
Константы.
Последовательность, состоящая из одной или более цифр 0, 1, … , 9, является целой (INTEGER) константой. Данный тип занимает в памяти 2 байта. Последовательность цифр, разделенных точкой, является вещественной (REAL) константой, данный тип занимает в памяти 4 байта. Последовательность любых символов (кроме знака одинарных кавычек), заключенных в одинарные кавычки, является строковой (STRING) константой, длина данного типа варьируется от 1 до 255 байт, в зависимости от числа символов в последовательности.
Выражения.
Операции в выражении выполняются слева направо; как обычно, учитывается наличие скобок и приоритеты операторов. Приоритеты операторов приведены в таблице 5 (оператор в первой строке имеет наивысший приоритет):
Таблица 5 – Таблица приоритетов
– (унарный)
*  /  div
+  – (бинарный)
=  <>  <  >  <=  >=
 
Ключевые слова, идентификаторы, лексемы отделяются друг от друга пробелами, от специальных символов разделение не обязательно.
Возможные для использования символы:
буквы: а..я, А..Я, a..z, A..Z;
символ, разрешенный при написании имен: _
элементы разделения: ,  ;  :  пробел         
разделитель целой и дробной частей в вещественных числах: .
выделение текста: ′
знаки операторов: + - * /
комментарии:  { }
расстановка приоритетов: ( )
знаки сравнения: > < =  >=  <=  <>
признак окончания программы: .

2.3 Лексический анализатор LEXAN

 
Цель создания программы LEXAN состоит в том, чтобы научить студента производить разбор текста программы на составляющие ее лексемы в соответствии с заданной БНФ, при этом правильно заполнив таблицы выбранных терминальных символов, символических имен, литералов и выходных кодов лексем.
Данная среда позволяет сравнить данные, внесенные студентом с данными, полученными программой и сгенерировать сообщения об ошибках, на основе которых студент будет иметь возможность внести соответствующие исправления.
При выполнении дипломного проекта был проведен анализ способов построения лексического анализатора. За основу был принят прямой синтаксический анализатор, так как считывает лексему, находящуюся справа от указателя и лишь потом определяет тип лексемы [3]. Кроме того, отчасти используется непрямой анализ при отделении специальных символов от идентификаторов, ключевых слов и литералов, когда разделительный пробел не обязателен.
Лексический анализатор позволяет работать со следующими таблицами:
1)       таблица выбранных терминальных символов (формируется из таблицы терминальных символов);
2)       таблица символических имен (идентификаторов);
3)       таблица литералов (констант);
4)       таблица выходных кодов лексем.
Далее описываются структуры таблиц.

2.3.1 Таблица терминальных символов

 
Внутри программы хранится таблица терминальных символов. Она хранит в себе все терминальные символы, которые могут использоваться в учебном языке (ключевые слова и специальные символы). Они имеют свои названия, описание и каждому ключевому слову соответствует свой уникальный код, по которому происходит идентификация элемента на следующих стадиях компиляции. На данном этапе происходит работа с таблицей выбранных терминальных символов, пример которой показан в таблице 6.
Таблица 6 – Таблица выбранных терминальных символов
№ стр.
Терминальный символ
Комментарий
Код
1
PROGRAM
Объявление переменных
1
 
Таблица выбранных терминальных символов содержит следующие поля:
№ стр – номер строки в таблице выбранных терминальных символов;
Терминальный символ – название терминального символа;
Комментарий – описание терминального символа;
Код – код терминального символа, определенный в таблице терминальных символов.
Данная таблица формируется из таблицы терминальных символов, определенной внутри программы (описана в приложении А) путем выбора необходимых терминальных символов в соответствующем окне программы. Она служит (необходима) для проверки, является ли полученная лексема терминальным символом или идентификатором, т.е. производится сравнение со всеми терминальными символами таблицы. Если лексема найдена в таблице, то в таблицу выходных кодов лексем заносится номер таблицы (в программе №1) и код терминального символа.
Некоторые терминальные символы можно изменять – это ключевые слова. Изменение возможно в момент заполнения таблицы выбранных терминальных символов.

2.3.2 Таблица символических имен

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

2.3.3 Таблица литералов

 
Для хранения значений констант используется таблица литералов, пример ее заполнения показан в таблице 8.
Таблица 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 Следующая страница


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

Скачать дипломную работу бесплатно


Постоянный url этой страницы:
http://referatnatemu.com/?id=544&часть=5



вверх страницы

Рейтинг@Mail.ru
Copyright © 2010-2015 referatnatemu.com