Компилятор модельного языка программирования
Разработка на языке программирования C# в среде Microsoft Visual Studio 2010 на базе Microsoft NET Framework 4 (4.5) программного средства, реализующего компилятор модельного языка программирования. Лексический, синтаксический и семантический анализатор.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.06.2013 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
- Введение
- 1. Постановка задачи
- 2. Формальная модель задачи
- 3. Спецификация основных процедур и функций
- 3.1 Лексический анализатор
- 3.2 Синтаксический анализатор
- 3.3 Семантический анализатор
- 3.3.1 Обработка описаний
- 3.3.2 Анализ выражений и проверка правильности операторов
- 3.4 Генерации внутреннего представления программы
- 3.5 Интерпретатор программы
- 4. Структурная организация данных
- 4.1 Спецификация входной информации
- 4.2 Спецификация выходной информации
- 5. Укрупненная схема алгоритма программного средства
- 5.1 Конечный автомат
- 6. Руководство пользователя
- Заключение
- Список использованной литературы
- Приложение
- Введение
- Теория формальных языков и грамматик является основным разделом математической лингвистики - специфической математической дисциплины, ориентированной на изучение структуры естественных и искусственных языков.
- Эта теория возникла в 50-е годы в работах американского лингвиста
- Н. Хомского. По характеру используемого математического аппарата теория формальных грамматик и языков близка к теории алгоритмов и к теории автоматов.
Но уже в следующем десятилетии синтаксические методы нашли широкое практическое применение в области разработки и реализации языков программирования.
В настоящее время искусственные языки, использующие для описания предметной области текстовое представление, широко применяются не только в программировании, но и в других областях. С их помощью описывается структура всевозможных документов, трехмерных виртуальных миров, графических интерфейсов пользователя и многих других объектов, используемых в моделях и в реальном мире. Для того чтобы эти текстовые описания были корректно составлены, а затем правильно распознаны и интерпретированы, применяются специальные методы их анализа и преобразования. В основе данных методов лежит теория формальных языков, грамматик и автоматов.
Несмотря на то, что к настоящему времени разработаны тысячи различных языков и их компиляторов, процесс создания новых приложений в этой области не прекращается. Это связно как с развитием технологии производства вычислительных систем, так и с необходимостью решения все более сложных прикладных задач. Такая разработка может быть обусловлена различными причинами, в частности, функциональными ограничениями, отсутствием локализации, низкой эффективностью существующих компиляторов.
Цель курсовой работы:
- закрепление теоретических знаний в области теории формальных языков, грамматик, автоматов и методов трансляции;
- формирование практических умений и навыков разработки собственного компилятора модельного языка программирования.
1. Постановка задачи
1. Составить формальное описание модельного языка программирования с помощью:
- РБНФ;
- диаграмм Вирта;
- формальных грамматик.
2. Написать пять примеров программ.
3. Составить таблицы лексем и диаграмму состояний с действиями для распознавания и формирования лексем языка.
4. По диаграмме с действиями написать функцию сканирования текста входной программы на модельном языке.
5. Разработать программное средство, реализующее лексический анализ текста программы на входном языке.
6. Реализовать синтаксический анализатор текста программы на модельном языке.
7. Построить цепочку вывода и дерево разбора простейшей программы на модельном языке из начального символа грамматики.
8. Дополнить синтаксический анализатор процедурами проверки семантической правильности программы на модельном языке в соответствии с контекстными условиями своего варианта.
9. Показать динамику изменения содержимого стека при семантическом анализе программы на примере одного синтаксически правильного выражения.
10. Записать правила вывода грамматики с действиями по переводу в ПОЛИЗ программы на модельном языке.
11. Пополнить разработанное программное средство процедурами, реализующими генерацию внутреннего представления введенной программы в форме ПОЛИЗа.
12. Разработать интерпретатор ПОЛИЗа программы на модельном языке.
13. Составить набор контрольных примеров, демонстрирующих:
а) все возможные типы лексических, синтаксических и семантических ошибок в программах на модельном языке;
б) перевод в ПОЛИЗ различных конструкций языка;
в) представить ход интерпретации синтаксически и семантически правильной программы с помощью таблицы.
2. Формальная модель задачи
Определение понятия «идентификатор» с использованием РБНФ имеет вид
<идентификатор> ::= <буква> | <идентификатор> <цифра>
<буква>:: =A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W |X |Y | Z |a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
<цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<целое>::= <двоичное> | <восьмеричное> | <десятичное> |
<шестнадцатеричное>
<двоичное>::= {/ 0 | 1 /} (B | b)
<восьмеричное>::= {/ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 /} (O | o)
<десятичное>::= {/ <цифра> /} [D | d]
<шестнадцатеричное>::= <цифра> {<цифра> | A | B | C | D | E | F | a | b |
c | d | e | f} (H | h)
В соответствии с данными правилами синтаксис модельного языка будет выглядеть следующим образом
<буква>:: =A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W |X |Y | Z |a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
<цифра>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<идентификатор>::= <буква> { <буква> | <цифра> }
<число> ::= {/< цифра> /}
<ключевое_слово>::= plus | min | or | mult |div | and | end | dim | integer|
real | boolean |as | if | then | else | for | to |do | while| read |write | true | false | NE | EQ | LT | LE | GT | GE
<разделитель>::= ~ | : | , | [ | ] | \n | ( | ) | { | }
<программа>= {/(<описание> | <оператор>) (: | переход строки) /} end
<описание>::= dim <идентификатор> {, <идентификатор> } <тип>
<оператор>::= <присваивания> | <условный> | <условного_цикла> | <составной> | <фиксированного_цикла> |<ввода> |<вывода>
<присваивания>::= <идентификатор> as <выражение>
- <условный>::= if <выражение> then <оператор> [ else <оператор>]
- <условного_цикла>::= while <выражение> do <оператор>
- <составной>::= «[» <оператор> { ( : | перевод строки) <оператор> } «]»
- <фиксированного_цикла>::= for <присваивания> to <выражение> do <оператор>
- <ввода>::= read «(»<идентификатор> {, <идентификатор> } «)»
- <вывода>::= write «(»<выражение> {, <выражение> } «)»
- <выражение>:: = <операнд> {<операции_группы_отношения> <операнд>}
- <операнд>::= <слагаемое>{<операции_группы_умножения> <слагаемое>}
- <слагаемое>::=<множитель>{<операции_группы_умножения> <множитель>}
- <множитель>::=<идентификатор> |<число> |<логическая_константа> |<унарная_операция> <множитель> |<<(>> <выражение> <<)>>
- Формальные грамматики
- P telo
- telo OperL | Opis | telo; OperL; | telo; Opis
- OperL Oper; | Oper; OperL
- Opis Type Id1
- Id1 Id | Id1, Id
- Id Byk | Byk Id | Cifra Id
Byk A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
U | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p
q | r | s | t | u | v | w | x | y | z
Cifra 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Type integer | real | boolean
Oper [Sost] | Prisv | IF | F_C | WH_C | Vvod | Vivod
Sost Oper | Oper Znak Sost
Znak : | \n
Prisv Id as Virag
IF if Virag then Oper | if Virag then Oper else Oper
F_C for Prisv to Virag do Oper
WH_C while Virag do Oper
Vvod read(IdList)
Vivod write(ViragList)
ViragList Virag | Virag,ViragList
Virag Op | Op NE Virag | Op EQ Virag | Op LT Virag | Op LE Virag | Op GT Virag | Op GE Virag
Op Sum | Sum plus Op | Sum min Op | Sum or Op
Sum Mn | Mn mult Sum | Mn div Sum | Mn and Sum
Mn Id | Ch | LC | UN Mn | (Virag)
UN ~
Ch Ze | De
LC true | false
Ze Bin | Oo | Dd | Hh
Bin Bin1 Bin2
Bin1 0 | 1 | 0 Bin1 | 1 Bin2
Bin2 B | b
Oo Oo1| Oo2
Oo1 O1 | O1 Oo1
O1 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
Oo2 O | o
Dd Dd1 Dd2
Dd1 Cifra | Cifra Dd1
Dd2 D | d
Hh H1 H2
H1 Cifra | H1 H3
H3 Cifra | A | B | C | D | E | F | a | b | c | d | e | f
H2 H | h
De Chst Por | . Chst | Chst . Chst | . Chst Por | Chst . Chst Por
Chst Cifra | Cifra Chst
Por E1 Chst | E1 Pm Chst
E1 E | e
Pm + | -
Описание синтаксиса модельного языка с помощью диаграмм Вирта
3. Спецификация основных процедур и функций
программирование компилятор модельный язык
3.1 Лексический анализатор
Лексический анализатор (ЛА) - это первый этап процесса компиляции, на котором символы, составляющие исходную программу, группируются в отдельные минимальные единицы текста, несущие смысловую нагрузку - лексемы. Функции, реализующие лексический анализ приведены в Таблице 1.
Таблица 1 - Функции лексического анализа
Имя |
Назначение |
Вход |
Выход |
|
void gc() |
процедура считывания очередного символа текста в переменную ch |
исходная строка |
- |
|
bool Let() |
проверка, является ли ch буквой |
очередной символ |
результат проверки |
|
bool Digit() |
проверка, является ли ch цифрой |
очередной символ |
значение буфера |
|
void NullB() |
обнуление буфера B |
буфера B |
- |
|
void NullS() |
обнуление буфера S |
буфера S |
- |
|
void Add() |
процедура добавления очередного символа в конец буфера B |
очередной символ |
буфера B |
|
void AddDigit() |
процедура добавления очередного символа в конец буфера S |
очередной символ |
буфера S |
|
bool AFHO() |
проверка, принадлежности kb ch диапазону a-f,h,0 |
очередной символ |
результат проверки |
|
bool AFH() |
проверка, принадлежности kb ch диапазону a-f,h |
очередной символ |
результат проверки |
|
void Look(List<string> ntable) |
процедура поиска лексемы буфера B в таблицу t |
таблица лексем |
номер лексемы в таблицу |
|
Put(List<string> ntable) |
процедура записи лексемы из буфера B в таблицу t |
таблица лексем |
номера лексемы в таблице |
|
Put(List<double> ntable) |
процедура записи лексемы из буфера S в таблицу t |
таблица лексем |
номера лексемы в таблице |
|
Out(int Ntable, int Value) |
процедура записи пары чисел (n, k) в файл лексем |
номер таблицы, номер элемента |
список лексем |
|
void LexAnalyzer (string str) |
осуществляет лексический анализ и возвращает результат анализа |
текст анализи-руемой программы |
результат работы |
3.2 Синтаксический анализатор
Задача синтаксического анализатора: провести разбор текста программы, сопоставив его с эталоном, данным в описании языка. Для синтаксического разбора используются контекстно-свободные грамматики (КС-грамматика).
Один из эффективных методов синтаксического анализа - метод рекурсивного спуска.
Метод рекурсивного спуска или нисходящий разбор - это один из методов определения принадлежности входной строки к некоторому формальному языку, описанному контекстно-свободной грамматикой (КС-грамматика). Функции, реализующие синтаксический анализатор, описаны в Таблице 2.
Таблица 2 - Функции синтаксического анализа
Имя |
Назначение |
Вход |
Выход |
|
void _gl() |
получает очередную лексему |
номер текущей лексемы |
очередная лексема |
|
bool _eq(string caption) |
проверяет, является ли строка лексемой |
проверяемая лексема |
результат проверки |
|
bool _id() |
функция, проверяющая, является ли LEX идентификатором |
проверяемая лексема |
результат проверки |
|
bool _num() |
логическая функция, проверяющая, является ли LEX числом |
проверяемая лексема |
результат проверки |
|
void _errors(string errstr) |
функция, сохраняющая название ошибки |
ошибка |
- |
|
void Program() |
осуществляет разбор программы |
очередная лексема |
результат проверки |
|
void DescriptionVar() |
осуществляется разбор списка описаний |
очередная лексема |
результат проверки |
|
void Description() |
осуществляет разбор описания |
очередная лексема |
результат проверки |
|
void _idList(int key) |
проверяет наличие списка идентификаторов |
очередная лексема |
результат проверки |
|
void _operatorList() |
осуществляет разбор операторов |
очередная лексема |
результат проверки |
|
bool _type() |
осуществляется проверка принадлежности лексемы к типам переменных |
очередная лексема |
результат проверки |
|
void _operator () |
определяет тип оператора |
очередная лексема |
результат проверки |
|
void _write() |
оператор записи |
очередная лексема |
результат проверки |
|
void _read() |
оператор чтения |
очередная лексема |
результат проверки |
|
bool _operationsRatio() |
проверяет, является ли лексем операцией сравнения |
очередная лексема |
результат проверки |
|
bool _operationsAdd() |
проверяет, является ли лексема операции группы сложения |
очередная лексема |
результат проверки |
|
bool _operationsMultiplication() |
проверяет, является ли лексема операции группы умножения |
очередная лексема |
результат проверки |
|
bool _logicalConstant() |
проверяет, является ли лексема логической константой |
очередная лексема |
результат проверки |
|
bool _not() |
проверяет, является ли лексема унарной операцией |
очередная лексема |
результат проверки |
|
void _expression() |
осуществляет разбор выражений |
очередная лексема |
результат проверки |
|
void _expressionList() |
осуществляет разбор списка лексем |
очередная лексема |
результат проверки |
|
void _operand() |
осуществляет разбор операндов |
очередная лексема |
результат проверки |
|
void _add() |
осуществляет разбор слагаемых |
очередная лексема |
результат проверки |
|
void _factor() |
осуществляет разбор множителей |
очередная лексема |
результат проверки |
|
void _appropriate(string str) |
осуществляет разбор оператора присваивания |
тип присвоения |
результат проверки |
|
void _if() |
осуществляет разбор условного оператора |
очередная лексема |
результат проверки |
|
void _for() |
осуществляет разбор цикла со счетчиком |
очередная лексема |
результат проверки |
|
void _while() |
осуществляет разбор цикла с условием |
очередная лексема |
результат проверки |
|
void mark() |
проверяет, является ли лексема «;» или «\n» |
очередная лексема |
результат проверки |
|
void _compoundOperator () |
осуществляет разбор составного оператора |
очередная лексема |
результат проверки |
3.3 Семантический анализатор
В ходе семантического анализа проверяются отдельные правила записи исходных программ, которые не описываются КС-грамматикой. Эти правила носят контекстно-зависимый характер, их называют семантическими соглашениями или контекстными условиями.
В программе синтаксический и семантический анализаторы совмещены и осуществляются параллельно.
Соблюдение контекстных условий для языка М предполагает три типа проверок:
1) обработка описаний;
2) анализ выражений;
3) проверка правильности операторов.
Рассмотрим три типа проверок подробнее.
3.3.1 Обработка описаний
Функции, реализующие обработку описаний, описаны в Таблице 3.
Таблица 3 - Обработка описаний
Имя |
Назначение |
Вход |
Выход |
|
void _dec(string type) |
процедура вывода всех чисел из стека |
название типа |
стек |
|
void _decId(int value, string type) |
процедура проверки и заполнения поля «описан» и «тип» таблицы идентификаторов |
номер лексемы и тип |
результат проверки |
3.3.2 Анализ выражений и проверка правильности операторов
Задача анализа выражений: проверить описаны ли переменные, встречающиеся в выражениях, и соответствуют ли типы операндов друг другу и типу операции.
Эти задачи решаются следующим образом: вводится таблица двуместных операций и стек, в который в соответствии с разбором выражения E заносятся типы операндов и знак операции. После семантической проверки в стеке остается только тип результата операции. В результате разбора всего выражения в стеке остается тип этого выражения.
Задачи проверки правильности операторов:
1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
2) установить соответствие типов в операторе присваивания слева и справа от символа присваивания;
3) определить, является ли выражение в операторах условия и цикла булевым. Функции, реализующие анализ выражений и проверку правильности операторов, описаны в Таблице 4.
Таблица 4 - Анализ выражений и проверка правильности операторов
Имя |
Назначение |
Вход |
Выход |
|
void _checkId() |
если идентификатор описан, то помещает его тип в стек |
проверяемая лексема |
добавление в стек |
|
void _checkOperation() |
процедура, выводящая из стека типы операндов и знак операции |
стек |
типы операндов и знак операции |
|
_getType(string operation, string type1,string type2) |
процедура, проверяющая соответствие типов |
типы операндов и знак операции |
результат проверки |
|
void _checkNot() |
процедура проверки типа для одноместной операции «~». |
проверяемая лексема |
результат проверки |
|
void _eqBool() |
процедура проверки типа выражения на логический тип |
проверяемая лексема |
результат проверки |
|
void _eqType(string str) |
процедура проверки типа выражения |
тип выражения |
результат проверки |
3.4 Генерации внутреннего представления программы
В программе на ряду с синтаксическим и с семантическим анализаторами параллельно происходит генерация внутреннего представления программы.
В качестве языка для представления промежуточной программы выберем постфиксную запись - ПОЛИЗ (польская инверсная запись).
Функции, реализующие генерацию, описаны в Таблице 5.
Таблица 5 - Генерации внутреннего представления программы
Имя |
Назначение |
Вход |
Выход |
|
void _put_lex(string str) |
если идентификатор описан, то помещаем его тип в стек |
очередная лексема |
массив P |
|
void _put_l() |
запись текущей лексемы в массив P; |
текущая лексема |
массив P |
|
void _put_l5() |
запись текущей лексемы в массив P с изменением четвертого класса лексем на пятый |
текущая лексема |
массив P |
|
void _put_op() |
запись в массив P знака операции |
знак операции |
массив P |
|
LexicalAnalysis.LexStuct _make(int k) |
процедура, формирующая лексему-метку (0, k) |
номер лексемы |
лексема |
3.5 Интерпретатор программы
Интерпретатор анализирует и тут же выполняет программу по одной команде, по мере поступления её исходного кода на вход интерпретатора.
Запись программы в форме ПОЛИЗа удобна для последующей интерпретации (выполнения программы) с помощью стека. Массив ПОЛИЗа просматривается один раз слева направо, при этом:
1) если очередной элемент ПОЛИЗа является операндом, то его значение заносят в стек;
2) если очередной элемент операция, то на «верхушке» стека находятся ее операнды, которые извлекаются из стека, над ними выполняется соответствующая операция, результат которой заносится в стек;
3) интерпретация продолжается до тех пор, пока не будет считан из ПОЛИЗа признак окончания ПОЛИЗа, стек при этом должен быть пуст.
В данной реализации интерпретатор представлен в виде отдельного программного модуля. Для реализации интерпретатора были использованы функции, описанные в Таблице 6.
Таблица 6 - Интерпретатор программы
Имя |
Назначение |
Вход |
Выход |
|
int _addr( LexicalAnalysis.LexStuct l) |
функция, выдающая адрес ячейки, отведенной для хранения лексемы l |
проверяемая лексема |
адрес лексемы |
|
double _cont(int address, int ntable) |
функция, выдающая содержимое ячейки с адресом А |
адрес лексемы и номер таблицы |
значение лексемы |
|
void _let(int Address, double x) |
процедура записи в ячейку с адресом А значения х |
адрес лексемы и её значение |
лексема |
|
void _inst(double x) |
процедура записи в стек значения х |
значение |
стек |
|
double _outst() |
процедура считывания из стека значения х |
стек |
значение |
|
void Interpreter() |
выполнение инструкции ПОЛИЗа |
сгенерированный ПОЛИЗ |
результат выполнения программы |
4. Структурная организация данных
4.1 Спецификация входной информации
В программе используется три типа класса:
class LexicalAnalysis для лексического анализа;
class Parsing для синтаксического, семантического и генерация внутреннего представления программы;
class PolIW для интерпретации программы.
Таблица 7 - Входные данные
Имя |
Тип |
Назначение |
|
TW |
List<string> |
таблица служебных слов |
|
TL |
List<string> |
таблица ограничителей |
|
TN |
List<double> |
таблица чисел |
|
TI |
List<string> |
таблица идентификаторов |
В программе используются следующие пользовательские типы данных:
Таблица 8 - Описание структуры для хранения информации о лексеме (struct LexStuct)
Имя |
Тип |
Назначение |
|
ntable |
int |
номер таблицы |
|
value |
int |
позиция в таблице лексем |
Таблица 9 - Описание структуры для хранения всей информации, необходимой для обработки описаний (struct DescriptionStruct)
Имя |
Тип |
Назначение |
|
flag |
bool |
флаг описания |
|
type |
string |
название типа |
4.2 Спецификация выходной информации
Таблица 10 - Спецификация выходной информации
Имя |
Тип |
Назначение |
|
LexList |
List< LexStuct> |
хранит результат лексического анализа |
|
P |
LexicalAnalysis.LexStuct[] |
хранит ПОЛИЗ программы |
|
error |
string |
строка сообщений об ошибках |
5. Укрупненная схема алгоритма программного средства
Укрупненная схема алгоритма программного средства представлена на рисунке 1.
Рисунок 1 - Укрупненная схема алгоритма программного средства
5.1 Конечный автомат
Схема алгоритма лексического анализатора представлена в виде конечного автомата, который изображен на рисунке 2.
Рисунок 2 - Диаграмма состояний для модельного языка
6. Руководство пользователя
Минимальные требования к аппаратному обеспечению:
1. 128 Мб оперативной памяти;
2. 32 Мб видеопамять;
3. 20 Мб свободной памяти на жестком диске;
4. устройство ввода (клавиатура, мышь);
5. разрешение монитора: 800x600.
Минимальные требования к программному обеспечению:
1. операционная система Windows XP/Vista /Win7;
2. наличие установленного пакета .Net Framework 4 (4.5).
Установка программного средства:
1. скопировать исполнительный файл Com.exe;
2. скопировать библиотеку ComLibrary.dll.
Для начала работы с программным средством необходимо запустить исполняемый файл. Появляется главное окно программы (рисунок 3).
Рисунок 3 - Вид главного окна программы
В данном окне можно вводить, редактировать, текст программы на модельном языке, а так же выполнить лексический, синтаксический, семантический анализ, перевод текста программы в ПОЛИЗ и интерпретацию программы. А также считать программу из файла и сохранить в файл.
Рисунок 4 - Выполнение программы на модельном языке
При успешном завершении лексического анализа программа инициализирует таблицы чисел, идентификаторов, формирует таблицу лексем.
Для операции ввода и вывода используется следующая форма на рисунке 5.
Рисунок 5 - Форма ввода и вывода
Заключение
Разработали на языке программирования C# в среде Microsoft Visual Studio 2010 на базе Microsoft NET Framework 4 (4.5) программное средство реализующее компилятор модельного языка программирования. Программное средство способно выполнять следующие функции:
- ввод и редактирование текста программ, написанных на определенном модельном языке;
- подсветку синтаксиса введенных программ, опираясь на таблицу служебных слов;
- производить лексический анализ программ;
- выполнять синтаксическую и семантическую проверку программ;
- переводить программы в ПОЛИЗ;
- интерпретировать программы на модельном языке, записанных в форме ПОЛИЗа.
Программное средство протестировано на различных программах, написанных на модельном языке.
Оно производит лексический анализ программ, выполняет синтаксическую и семантическую проверку, переводит программы в польскую запись, интерпретирует программы на модельном языке, записанную в форме ПОЛИЗа. А в случае возникновения ошибок на любом из этапов работы программы информирует о них пользователя.
Таким образом, поставленная цель курсовой работы достигнута.
Приложения
Приложение А
«Таблицы служебных слов и ограничителей»
Таблица 11 - Таблица служебных слов
0 |
plus |
|
1 |
min |
|
2 |
or |
|
3 |
mult |
|
4 |
div |
|
5 |
and |
|
6 |
end |
|
7 |
dim |
|
8 |
integer |
|
9 |
real |
|
10 |
boolean |
|
11 |
if |
|
12 |
then |
|
13 |
else |
|
14 |
for |
|
15 |
to |
|
16 |
do |
|
17 |
while |
|
18 |
read |
|
19 |
write |
|
20 |
true |
|
21 |
false |
Таблица 12 - Таблица ограничителей
0 |
\n |
|
1 |
~ |
|
2 |
: |
|
3 |
, |
|
4 |
[ |
|
5 |
] |
|
6 |
( |
|
7 |
) |
|
8 |
{/ |
|
9 |
/} |
|
10 |
<> |
|
11 |
= |
|
12 |
< |
|
13 |
<= |
|
14 |
> |
|
15 |
>= |
|
16 |
:= |
|
17 |
!F |
|
18 |
R |
|
19 |
W |
Приложение Б
«Таблица двухместных операций»
Таблица 13 - Таблица двуместных операций
NE,as,LT,LE,GT,GE |
integer |
integer |
boolean |
|
real |
real |
boolean |
||
integer |
real |
boolean |
||
real |
integer |
boolean |
||
plus,min |
integer |
integer |
integer |
|
real |
real |
real |
||
integer |
real |
real |
||
real |
integer |
real |
||
mult,div |
integer |
integer |
real |
|
real |
real |
real |
||
integer |
real |
real |
||
real |
integer |
real |
||
or |
boolean |
boolean |
boolean |
|
and |
boolean |
boolean |
boolean |
Приложение В
«ПОЛИЗ программы. Интерпретация ПОЛИЗа»
dim integer q
read q
q:= q plus 1
write q
end
ПОЛИЗ программы представлен на рисунке 6.
Рисунок 6 - ПОЛИЗ программы
Обозначения:
@ num - адрес переменой.
^ pos - переход в заданную метку ПОЛИЗа.
Таблица 14 - Ход интерпретации ПОЛИЗа программы
Стек |
Текущий элемент ПОЛИЗа |
Операция |
Таблицы переменных |
||
адреса |
значения |
||||
пуст |
0 |
адрес - в стек |
0) q |
0) - |
|
0 |
1 |
извлечь из стека номер элемента таблицы значений и записать по нему число 2 |
0) q |
0) 2 |
|
пуст |
2 |
адрес - в стек |
0) q |
0) 2 |
|
0 |
3 |
значение - в стек |
0) q |
0) 2 |
|
0, 2 |
4 |
число - в стек |
0) q |
0) 2 |
|
0, 2, 1 |
5 |
извлечь 2 и 1 и записать их сумму в стек |
0) q |
0) 2 |
|
0, 3 |
6 |
извлечь из стека 3, извлечь номер элемента таблицы и записать по нему число 3 |
0) q |
0) 2 |
|
пуст |
7 |
значение - в стек |
0) q |
0) 3 |
|
3 |
8 |
извлечь число из стека и вывести его на экран |
0) q |
0) 3 |
|
пуст |
9 |
интерпретация завершена |
0) q |
0) 3 |
Приложение Г
«Цепочка вывода и дерево разбора»
dim integer q
read q
q as q plus 1
write q
end
Цепочка вывода:
P
telo
dim telo \n OperL end
dim Opis \n OperL end
dim Type Id1 \n OperL end
dim Type Id, Id1 \n OperL end
dim Type Byk, Id1 \n OperL end
dim Type q, Id1 \n OperL end
dim q, Id Opis \n OperL end
dim Type q Byk \n OperL end
dim Type q \n OperL end
dim integer q \n OperL end
dim integer q \n Oper \n OperL end
dim integer q \n read Id1 \n OperL end
dim integer q \n read Id \n OperL end
dim integer q \n read Byk \n OperL end
dim integer q \n read q \n OperL end
dim integer q \n read q \n Oper \n OperL end
dim integer q \n read q \n Prisv \n OperL end
dim integer q \n read q \n Id as Virag \n OperL end
dim integer q \n read q \n OperL end
dim integer q \n read q \n q := Virag \n OperL end
dim integer q \n read q \n q := Sum \n OperL end
dim integer q \n read q \n q := Sum plus Op \n OperL end
dim integer q \n read q \n q := Id plus Sum \n OperL end
dim integer q \n read q \n q := Byk plus Sum \n OperL end
dim integer q \n read q \n q := q plus Sum \n OperL end
dim integer q \n read q \n q := q plus Op \n OperL end
dim integer q \n read q \n q := q plus Ch \n OperL end
dim integer q \n read q \n q := q plus De \n OperL end
dim integer q \n read q \n q := q plus Cifra Dd \n OperL end
dim integer q \n read q \n q := q plus 1 \n OperL end
dim integer q \n read q \n q := q plus 1 \n Oper end
dim integer q \n read q \n q := q plus 1 \n write (Virag) end
dim integer q \n read q \n q := q plus 1 \n write Sum end
dim integer q \n read q \n q := q plus 1 \n write Op end
dim integer q \n read q \n q := q plus 1 \n write Id end
dim integer q \n read q \n q := q plus 1 \n write Byk end
dim integer q \n read q \n q := q plus 1 \n write q end
Размещено на Allbest.ru
Рисунок 7 - Дерево разбора
Подобные документы
Основные методы описания синтаксиса языков программирования: формальные грамматики, формы Бэкуса-Наура и диаграммы Вирта. Разработка алгоритма решения задачи. Лексический и синтаксический анализатор, семантический анализ. Структурная организация данных.
курсовая работа [680,1 K], добавлен 12.06.2011Характеристика основных разделов программирования, изучаемых в курсе программирования на языке С++. Описание внутренних переменных, входных и выходных данных. Особенности использования компилятора Microsoft Visual Studio 2008. Руководство пользователя.
курсовая работа [18,8 K], добавлен 14.12.2010Разработка игры "Угадай персонажа", ее суть и содержание. Запоминание новых персонажей и вопросов, коррекция базы данных. Использование языка программирования С++ и среды разработки Microsoft Visual Studio 2010. Алгоритмы и методы, структура программы.
курсовая работа [571,9 K], добавлен 14.07.2012Функции и основные компоненты систем программирования. Средства создания программ. Трансляторы языков программирования. Принципы и фазы работы компилятора, трансформация языка программирования в машинный код. Механизм преобразования интерпретатора.
презентация [3,3 M], добавлен 07.02.2012Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009Проведение сравнительного анализа языков программирования. Создание алгоритма и специфика составления математической модели программы "Механические часы, показывающие текущее время" в среде Microsoft Visual Studio 2010, на базе языка программирования С++.
курсовая работа [408,9 K], добавлен 11.03.2013Лаконичность, стандартный набор конструкций управления потоком выполнения, структур данных и обширный набор операций в основе языка программирования Си. Фортран как первый язык программирования с транслятором. Перевод программных кодов с Фортрана на Си.
отчет по практике [77,4 K], добавлен 18.10.2012Место компилятора в программном обеспечении. Принципы работы и автоматизация построения синтаксического анализатора. Дерево разбора и его преобразование в дерево операций. Назначение и этапы семантического анализа. Идентификация языков программирования.
реферат [265,1 K], добавлен 20.12.2007Проектирование игры "Жизнь" и ее реализация в среде разработки Visual Studio 2010, версия .Net Framework 4.0. Особенности языка программирования C#, основных принципов ООП на языке C#. Проектирование пользовательского интерфейса. Описание алгоритмов.
курсовая работа [990,0 K], добавлен 18.04.2013Техника создания графики при помощи API функций, экспортируемых библиотекой GDI32.DLL. Разработка на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.
курсовая работа [2,8 M], добавлен 27.01.2010