Компилятор модельного языка программирования

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    356,85 Кб
  • Опубликовано:
    2013-06-24
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Компилятор модельного языка программирования

Содержание

Введение

. Постановка задачи

. Формальная модель задачи

. Спецификация основных процедур и функций

.1 Лексический анализатор

.2 Синтаксический анализатор

.3 Семантический анализатор

.3.1 Обработка описаний

.3.2 Анализ выражений и проверка правильности операторов

.4 Генерации внутреннего представления программы

.5 Интерпретатор программы

. Структурная организация данных

.1 Спецификация входной информации

.2 Спецификация выходной информации

. Укрупненная схема алгоритма программного средства

.1 Конечный автомат

. Руководство пользователя

Заключение

Список использованной литературы

Приложение

Введение

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

Эта теория возникла в 50-е годы в работах американского лингвиста

Н. Хомского. По характеру используемого математического аппарата теория формальных грамматик и языков близка к теории алгоритмов и к теории автоматов.

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

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

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

Цель курсовой работы:

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

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

1. Постановка задачи

1.      Составить формальное описание модельного языка программирования с помощью:

-       РБНФ;

-       диаграмм Вирта;

-       формальных грамматик.

.        Написать пять примеров программ.

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

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

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

.        Реализовать синтаксический анализатор текста программы на модельном языке.

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

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

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

.        Записать правила вывода грамматики с действиями по переводу в ПОЛИЗ программы на модельном языке.

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

.        Разработать интерпретатор ПОЛИЗа программы на модельном языке.

.        Составить набор контрольных примеров, демонстрирующих:

а)      все возможные типы лексических, синтаксических и семантических ошибок в программах на модельном языке;

б)      перевод в ПОЛИЗ различных конструкций языка;

в)      представить ход интерпретации синтаксически и семантически правильной программы с помощью таблицы.

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 || 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|| 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® OperL | Opis | telo; OperL; | telo; Opis® Oper; | Oper; OperL® Type Id1® Id | Id1, Id® Byk | Byk Id | Cifra Id® A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T || V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p| r | s | t | u | v | w | x | y | z® 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9® integer | real | boolean® [Sost] | Prisv | IF | F_C | WH_C | Vvod | Vivod® Oper | Oper Znak Sost® : | \n® Id as Virag® if Virag then Oper | if Virag then Oper else Oper_C ® for Prisv to Virag do Oper_C ® while Virag do Oper® read(IdList)® write(ViragList)® Virag | Virag,ViragList® Op | Op NE Virag | Op EQ Virag | Op LT Virag | Op LE Virag | Op GT Virag | Op GE Virag® Sum | Sum plus Op | Sum min Op | Sum or Op® Mn | Mn mult Sum | Mn div Sum | Mn and Sum® Id | Ch | LC | UN Mn | (Virag)® ~® Ze | De® true | false® Bin | Oo | Dd | Hh® Bin1 Bin2® 0 | 1 | 0 Bin1 | 1 Bin2® B | b® Oo1| Oo2® O1 | O1 Oo1® 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7® O | o® Dd1 Dd2® Cifra | Cifra Dd1® D | d® H1 H2® Cifra | H1 H3® Cifra | A | B | C | D | E | F | a | b | c | d | e | f® H | h® Chst Por | . Chst | Chst . Chst | . Chst Por | Chst . Chst Por® Cifra | Cifra Chst® E1 Chst | E1 Pm Chst® E | e® + | -

Описание синтаксиса модельного языка с помощью диаграмм Вирта











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)

осуществляет лексический анализ и возвращает результат анализа

текст анализи-руемой программы

результат работы

.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 Обработка описаний

Функции, реализующие обработку описаний, описаны в Таблице 3.

Таблица 3 - Обработка описаний

Имя

Назначение

Вход

Выход

void _dec(string type)

процедура вывода всех чисел из стека

название типа

стек

void _decId(int value, string type)

процедура проверки и заполнения поля «описан» и «тип» таблицы идентификаторов

номер лексемы и тип

результат проверки


3.3.2 Анализ выражений и проверка правильности операторов

Задача анализа выражений: проверить описаны ли переменные, встречающиеся в выражениях, и соответствуют ли типы операндов друг другу и типу операции.

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

Задачи проверки правильности операторов:

) выяснить, все ли переменные, встречающиеся в операторах, описаны;

) установить соответствие типов в операторе присваивания слева и справа от символа присваивания;

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

номер лексемы

лексема

.5 Интерпретатор программы

Интерпретатор анализирует и тут же выполняет программу по одной команде, по мере поступления её исходного кода на вход интерпретатора.

Запись программы в форме ПОЛИЗа удобна для последующей интерпретации (выполнения программы) с помощью стека. Массив ПОЛИЗа просматривается один раз слева направо, при этом:

) если очередной элемент ПОЛИЗа является операндом, то его значение заносят в стек;

) если очередной элемент операция, то на «верхушке» стека находятся ее операнды, которые извлекаются из стека, над ними выполняется соответствующая операция, результат которой заносится в стек;

) интерпретация продолжается до тех пор, пока не будет считан из ПОЛИЗа признак окончания ПОЛИЗа, стек при этом должен быть пуст.

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

.1 Спецификация входной информации

В программе используется три типа класса:LexicalAnalysis для лексического анализа;Parsing для синтаксического, семантического и генерация внутреннего представления программы;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. Руководство пользователя

Минимальные требования к аппаратному обеспечению:

.        128 Мб оперативной памяти;

.        32 Мб видеопамять;

.        20 Мб свободной памяти на жестком диске;

.        устройство ввода (клавиатура, мышь);

.        разрешение монитора: 800x600.

Минимальные требования к программному обеспечению:

.        операционная система Windows XP/Vista /Win7;

.        наличие установленного пакета .Net Framework 4 (4.5).

Установка программного средства:

.        скопировать исполнительный файл Com.exe;

.        скопировать библиотеку 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 qq:= q plus 1q

ПОЛИЗ программы представлен на рисунке 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

пуст

значение - в стек

0) q

0) 3

3

8

извлечь число из стека и вывести его на экран

0) q

0) 3

пуст

9

интерпретация завершена

0) q

0) 3


Приложение Г

«Цепочка вывода и дерево разбора»

dim integer qqas q plus 1q

Цепочка вывода:

®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

Похожие работы на - Компилятор модельного языка программирования

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!