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

Исследование теории формальных языков. Характеристика объектно-атрибутной архитектуры для реализации абстрактного автомата и транслятора языка. Особенность создания архитектуры автомата. Разработка виртуальных устройств и их программная реализация.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 04.12.2019
Размер файла 880,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

break;

case 101: // RezOutMK Выдача МК с результатом сравнения

MkExec(*(int*)(Load.Point), {Cbool , &Searcher.Rez });

break;

case 220: // FindOr

Searcher.FindOr(Load);

break;

case 225: // FindAnd

Searcher.FindAnd(Load);

break;

case 230: // FindXor

Searcher.FindXor(Load);

break;

case 235: // FindAndSource

Searcher.FindAndSource(Load);

break;

default:

CommonMk(MK, Load);

}

}

Файл «List.h»

// ФУ Список

#pragma once

#include "Consts.h"

#include "Search.h"

class List : public FU

{

public:

vector<ip>* ListHead = nullptr; // Указатель на начало списка

ip* LineUk=nullptr; // Указатель на найленную строку списка

int LineNum = 0; // Номер первой совпадающей линии

int MultiLineMode = 0; // 0 - поиск только первого совпадения, 1 - поиск всех совпадений

void ProgFU(int MK, LoadPoint Load) override;

int ReceiverMk = 0; // Мк для выдаваемой лексемы

int *ReceiverMkUk = &ReceiverMk; // Указатель на Мк для выдаваемой лексемы

vector<int> LineStack; // Стек номеров линий

Search Searcher;

IC_type FailAllProg = nullptr;

// vector<ip> *LineProg = nullptr;

vector<ip> *DefProg = nullptr;

List(FU *BusContext, FU *Templ) : FU(BusContext) { ProgFU(0, { 0, nullptr }); Bus = BusContext; Searcher.MainFU = this; };

List() : FU() { List(nullptr, nullptr); };

private:

};

Файл «List.cpp»

// ФУ Список

#include "stdafx.h"

#include "List.h"

using namespace std;

void List::ProgFU(int MK, LoadPoint Load)

{

switch (MK)

{

case 0: // Reset

break;

case 1: // Set

ListHead = (vector<ip>*)Load.Point;

break;

case 2:// Out Выдать ссылку на список

if (Load.Type >> 1 == Cvoid)

*(void**)Load.Point = ListHead;

break;

case 3:// OutMk Выдать МК со ссылкой на список

if (Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, { TIC,(void*)ListHead });

break;

case 5: // MultiLineModeSet

if(Load.Type>>1==Dint)

MultiLineMode = *(int *)Load.Point;

case 7: // MkModeSet Режим выполнения всех МК в ИК-шаблоне (МК-ой считается любой атрибут, индекс которого больше 0) При пустой нагрузке режим устанавливается

if (Load.Point == nullptr)

Searcher.MkMode = true;

else

switch (Load.Type >> 1)

{

case Dbool:

Searcher.MkMode = *(bool*)Load.Point;

case Dint:

Searcher.MkMode = *(int*)Load.Point;

}

break;

case 8:// EmptyProgExec Выполнить программу, если список пуст

if (ListHead == nullptr || ListHead->size() == 0)

if(Load.Type>>1==DIC)

ProgExec(Load.Point, Bus);

break;

case 9:// FullProgExec Выполнить программу, если список не пуст

if (ListHead != nullptr && ListHead->size() != 0)

if (Load.Type >> 1 == DIC)

ProgExec(Load.Point, Bus);

break;

case 10: // SuccessProgSet Установить указатель на программу, выполняемую при удачном поиска в линии списка

Searcher.SuccessProg = (vector<ip>*)Load.Point;

break;

case 11: // SuccessAfterProgSet Установить указатель на программу, выполняемую при удачном поиска в линии списка после обоработки программ линии

Searcher.SuccessAfterProg = (IC_type)Load.Point;

break;

case 15: // FailProgSet Установить указатель на программу, выполняемую в случае неудачного поиска в линии списка

Searcher.FailProg = (vector<ip>*)Load.Point;

break;

case 16: // FailAfterProgSet Установить указатель на программу, выполняемую в случае неудачного поиска в линии списка после обоработки программ линии

Searcher.FailAfterProg = (IC_type)Load.Point;

break;

case 17: // FailAllProgSet Установить указатель на программу, выполняемую в случае неудачного поиска во всем списке

FailAllProg = (vector<ip>*)Load.Point;

break;

case 20: // ProgAtrSet Установить атрибут программы

if (Load.Point != nullptr && Load.Type >> 1 == Dint)

Searcher.Prog_atr = *(int *)Load.Point;

break;

case 25: // BackOut Вылаить входной объект для поиска

if (Load.Type == TPPoint)

(*(LoadPoint*)Load.Point) = Searcher.Obj;

break;

case 30: // BackOutMk Вылаить МК со входным объектом для поиска

if (Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, Searcher.Obj.Clone());

break;

case 31: // CopyBackOutMk Вылаить МК со входным объектом для поиска

if (Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, Searcher.Obj.Clone());

break;

case 35: // LoadBackOutMk

if (Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, Searcher.Obj);

break;

case 36: // LoadCopyBackOutMk

if (Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, Searcher.Obj.Clone());

break;

case 90: // ProgAtrSet Установить атрибут программы

if ((Load.Type >> 1) == Dint)

Searcher.Prog_atr = *(int*)Load.Point;

break;

case 101: // RezOutMk Выдача МК с результатом сравнения

MkExec(*(int*)(Load.Point), { Cbool , &Searcher.Rez });

break;

case 105: // MkAtrAdd Добавить МК

if (Load.Type >> 1 == Dint)

Searcher.MkAtrAdd(*(int*)Load.Point);

break;

case 106: // MkAtrClear Очистить список МК

Searcher.MkAtrClear();

break;

case 150: //LastLineOut Выдать ссылку на последнюю линию списка

case 151: //LastLinePop Выдать ссылку на последнюю линию списка и удалить из списка

case 152: //LastLineDel Выдать ссылку на последнюю линию списка и удалить из ИК

if (Load.Type == Tvoid)

*(void**)Load.Point = (void*)ListHead->back().Load.Point;

if (MK == 152) ICDel((void*)ListHead->back().Load.Point);

if (MK == 151 || MK == 152) ListHead->pop_back();

break;

case 155: //LastLineOutMK Выдать ссылку на последнюю линию списка

case 156: //LastLinePopMK Выдать ссылку на последнюю линию списка и удалить из списка

case 157: //LastLineDelMk Выдать ссылку на последнюю линию списка и удалить из ИК

if (ListHead == nullptr) break;

MkExec(*(int*)Load.Point, { Tvoid , (void*)ListHead->back().Load.Point });

if (MK == 157) ICDel((void*)ListHead->back().Load.Point);

if (MK == 156 || MK == 157) ListHead->pop_back();

break;

case 160: // LineAdd Добавить строку

if (ListHead == nullptr) ListHead = new vector<ip>;

if (ListHead == nullptr)

ListHead = new vector<ip>;

ListHead->push_back({ Atr, Load });

break;

case 161: // LineCopyAdd Добавить копию строки

if (ListHead == nullptr) ListHead = new vector<ip>;

ListHead->push_back({ Atr, TIC, ICCopy(Load) });

break;

case 165: // LineExcludeMk Исключить линию списка

if (ListHead == nullptr || ListHead->size() == 0) break;

if(Load.Point!=nullptr && Load.Type>>1==Dint) MkExec(*(int*)Load.Point, { TIC , (void*)ListHead->back().Load.Point });

ListHead->pop_back();

break;

case 166: // LineDelMk Выдать МК со ссылкой на ИК и удалить ИК

if (ListHead == nullptr || ListHead->size() == 0) break;

MkExec(*(int*)Load.Point, { TIC , (void*)ListHead->back().Load.Point });

ICDel(ListHead->back().Load.Point);

ListHead->pop_back();

break;

case 167: // LineIpCut Удалить последние ИП из текущей линии (в нагрузке количество удаляемых ИП, по умолчанию 1)

case 168: // LineVarIpCut" Hint = "Удалить последние ИП c пемеменными из текущей линии (в нагрузке количество удаляемых ИП, по умолчанию 1)" }

if (LineUk != nullptr && LineUk->Load.Type>>1==DIC && LineUk->Load.Point!=nullptr)

{

int n;

if (Load.Point == nullptr || Load.Type >> 1 != Dint)

n = 1;

else

n = *(int*)Load.Point;

while (n-- && ((IC_type)LineUk->Load.Point)->size() != 0)

{

((IC_type)LineUk->Load.Point)->resize(((IC_type)LineUk->Load.Point)->size() - 1);

}

}

break;

case 170: // LastAttach Конкатенация ИК к последней линии списка

case 171: // LastCopyAttach Конкатенация копии ИК к последней линии списка

if (ListHead != nullptr && Load.Point != nullptr)

if (Load.Type >> 1 == DIP)

{

((IC_type)ListHead->back().Load.Point)->push_back(*(ip*)Load.Point);

if (MK == 170 && Load.Type == CIP) { delete (ip*)Load.Point; Load.Point = nullptr; Load.Type = 0; }

}

else

{

if (Load.Type >> 1 == DIC)

{

copy(((IC_type)Load.Point)->begin(), ((IC_type)Load.Point)->end(), inserter(*((IC_type)ListHead->back().Load.Point), ((IC_type)ListHead->back().Load.Point)->end()));

if (MK == 170 && Load.Type==CIP) { ICDel(Load.Point); Load.Point = nullptr; Load.Type = 0; };

}

}

break;

case 172: // LastCopyGrahpAttach

// ....

break;

case 175: // LineAttach Конкатенация ИК к текущей линии списка

case 176: // LineCopyAttach Конкатенация копии ИК к текущей линии списка

if (LineUk != nullptr && Load.Point != nullptr)

if (Load.Type >> 1 == DIP)

{

((IC_type)LineUk->Load.Point)->push_back(*(ip*)Load.Point);

if (MK == 175 && Load.Type == CIP) { delete (ip*)Load.Point; Load.Point = nullptr; Load.Type = 0; }

}

else

{

if (Load.Type >> 1 == DIC)

{

copy(((IC_type)Load.Point)->begin(), ((IC_type)Load.Point)->end(), inserter(*((IC_type)LineUk->Load.Point), ((IC_type)LineUk->Load.Point)->end()));

if (MK == 175 && Load.Type == CIP) { ICDel(Load.Point); Load.Point = nullptr; Load.Type = 0; };

}

}

break;

case 177: // LineCopyGrahpAttach

// ....

break;

case 185: // LastLoadSet Записать адрес в нагрузку последней ИП последней строки

case 195: // LineLoadSet Записать адрес в нагрузку последней ИП последней строки

case 186: // LastLoadCopySet Записать адрес в нагрузку последней ИП последней строки

case 196: // LineLoadCopySet Записать адрес в нагрузку последней ИП последней строки

case 187: // LastPointLoadCopyGraphSet

case 197: // LinePointLoadCopyGraphSet

case 189: // LastAtrSet Установить атрибут у последней ИК последней линии

case 199: // LineAtrSet Установить атрибут у последней ИК последней линии

{ IC_type t;

if (ListHead == nullptr || ListHead->back().Load.Point == nullptr || ListHead->back().Load.Type >> 1 != DIC) break;

if (((IC_type)ListHead->back().Load.Point)->size() == 0) break;

if (MK < 190)

t = ((IC_type)ListHead->back().Load.Point);

else if (LineUk != nullptr && LineUk->Load.Point != nullptr && LineUk->Load.Type >> 1 != DIC)

break;

else

t = (IC_type)LineUk->Load.Point;

switch (MK)

{

case 185:

case 195:

t->back().Load = Load; break;

case 186:

case 196:

if (Load.Type >> 1 != DIC)

t->back().Load.Copy(&Load);

else

{

t->back().Load.Type = Load.Type;

t->back().Load.Point = ICCopy(Load);

}

break;

case 189:

case 199:

if (Load.Type >> 1 == Dint)

t->back().atr = *(int*)Load.Point;

break;

// case 177: // LastPointLoadCopyGraphSet

// ...

//break;

}

break;

}

case 180: // LastPointVarTypeSet // Установить тип 'переменная' в последней ИП последней линии

case 182: // LinePointVarTypeSet // Установить тип 'переменная' в последней ИП текущей линии

case 181: // LastPointConstTypeSet // Установить тип 'константа' в последней ИП последней линии

case 183: // LinePointConstTypeSet // Установить тип 'константа' в последней ИП текущей линии

{

IC_type t;

if (ListHead != nullptr || ListHead->size()==0) break;

if (MK == 180 || MK==181)

{

if (ListHead->back().Load.Point == nullptr || ListHead->back().Load.Type >> 1 != DIC || ((IC_type)ListHead->back().Load.Point)->size() > 0)

break;

t = (IC_type)ListHead->back().Load.Point;

}

else

{

if (LineUk == nullptr || LineUk->Load.Point == nullptr || LineUk->Load.Type >> 1 != DIC || ((IC_type)LineUk->Load.Point)->size()==0)

break;

t = (IC_type)LineUk->Load.Point;

}

switch (MK)

{

case 180:

case 182: t->back().Load.VarTypeSet(); break;

case 181:

case 183: t->back().Load.ConstTypeSet(); break;

}

break;

}

case 200: // LineToLast Установить текущую строку на последнюю строку

if(ListHead!=nullptr && ListHead->size()>0 && ListHead->back().Load.Point!=nullptr && ListHead->back().Load.Type>>1==DIC)

LineUk = &ListHead->back();

break;

case 205: // LinePush Положить текущую линию в стек

if (LineNum >= 0 && LineNum < ListHead->size() > 0)

LineStack.push_back(LineNum);

break;

case 206: // LineLastPush Положить последнюю линию в стек

if (ListHead->size() > 0) LineStack.push_back(ListHead->size()-1);

break;

case 207: // LinePop Взять текущую линию из стека

if (LineStack.size() && ListHead->size()> LineStack.back() && LineStack.back()>=0)

{

LineNum = LineStack.back();

LineStack.pop_back();

LineUk = ListHead->begin()._Ptr+ LineNum;

}

break;

case 220: // FindOr Поиск ИЛИ

case 221: // FindOrLastLine Поиск ИЛИ в последней строке

case 226: // FindAnd Поиск И

case 227: // FindAndLastLine Поиск И в последней строке

case 230: // FindXor Поиск XOR

case 231: // FindXorLastLine Поиск XOR в последней строке

case 236: // FindAndSource Поиск И в источнике

case 237: // FindAndSourceLastLine Поиск И в источнике в последней строке

{

int Count = 0; // счетчик совпадений

LineNum = 0; // Номер первой совпадающей линии

int LineNumFirst = -1;

if (ListHead == nullptr)

{

Searcher.Template = { 0,nullptr };

Searcher.FindOr({ 0,nullptr });

ProgExec(FailAllProg, Bus);

break;

}

auto i = ListHead->begin();

if (MK % 2 == 1)

i = ListHead->end() - 1;

for (; i != ListHead->end(); i++)

{

LineUk = i._Ptr;

Searcher.Template = i->Load;

switch (MK)

{

case 220: // FindOr

Searcher.FindOr(Load);

break;

case 225: // FindAnd

Searcher.FindAnd(Load);

break;

case 230: // FindXor

Searcher.FindXor(Load);

break;

case 235: // FindAndSource

Searcher.FindAndSource(Load);

break;

}

if (Searcher.Rez)

{

Count++;

if (Count==1)

{

if (MK % 2 == 1)

LineNumFirst = ListHead->size() - 1;

else

LineNumFirst = LineNum;

}

if (MultiLineMode == 0) break;

}

LineNum++;

}

if (Count)

{

LineUk = &ListHead->at(LineNumFirst);

LineNum = LineNumFirst;

}

else

{

LineNum == -1;

LineUk = nullptr;

ProgExec(FailAllProg, Bus);

}

}

break;

case 400: // LineOutMk Выдать МК с найденной линией

if (Load.Point != nullptr && Load.Type >> 1 == Dint)

MkExec(*(int*)Load.Point, LineUk->Load);

break;

default:

CommonMk(MK, Load);

break;

}

}

Размещено на Allbest.ru

...

Подобные документы

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

    курсовая работа [697,2 K], добавлен 06.01.2013

  • Методика минимизации абстрактного автомата. Порядок построения графа полученного минимизированного автомата. Синтез на элементах ИЛИ-НЕ и Т-тригерах. Составление таблицы переходов. Разработка микропрограммного автомата, реализующего микропрограмму.

    курсовая работа [997,7 K], добавлен 28.03.2011

  • Методика разработки и частичная реализация транслятора для языка "С" с использованием языка "С++", производящего разбиение на минимальные неделимые конструкции языка исходной цепочки символов основываясь на лексике языка. Анализ работы программы.

    курсовая работа [841,3 K], добавлен 19.03.2012

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

    курсовая работа [580,5 K], добавлен 06.08.2013

  • Минимизация абстрактного автомата Мили, моделирование его работы. Синтез схемы конечного автомата, микропрограммного автомата и счетчика числа микрокоманд. Разработка цифровой линии задержки. Построение граф-схем исходного и оптимизированного автоматов.

    курсовая работа [823,8 K], добавлен 19.07.2012

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

    контрольная работа [141,5 K], добавлен 14.10.2012

  • Синтез цифрового автомата с комбинационной частью на логических элементах. Реализация спроектированного автомата в виде иерархического блока со схемой замещения на библиотечных компонентах в режиме SPICE–проектов. Разработка абстрактных символов.

    курсовая работа [831,2 K], добавлен 23.09.2013

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

    курсовая работа [506,9 K], добавлен 26.12.2012

  • Нормализация предметной области "Сайт знакомств" и ее программная реализация с использованием СУБД MySQL, языка HTML, технологии PHP и ADO, скриптовых языков VBScript или JavaScript. Руководство программиста, тестирование, исходный текст приложения.

    реферат [29,0 K], добавлен 09.09.2010

  • Содержание и особенности этапов синтеза дискретного автомата. Граф переходов-выходов автомата Мура, кодирование входных и выходных сигналов. Построение функциональной схемы автомата Мура на RS–триггерах и элементах И-НЕ в программе Electronic WorkBench.

    курсовая работа [964,2 K], добавлен 20.07.2015

  • Оптимізація схеми мікропрограмного автомата Мура за рахунок нестандартного подання кодів станів. Аналіз методів синтезу автомата та аналіз сучасного елементного базису. Використанні особливостей автомата для зменшення площини матричної схеми автомата.

    презентация [357,0 K], добавлен 16.10.2013

  • Проектирование лексического и синтаксического анализаторов учебного языка. Правила преобразования логических выражений в ПОЛИЗ. Формирование триад, оптимизация их списка. Логическая структура программы. Тестирование модулей транслятора-интерпретатора.

    курсовая работа [1,3 M], добавлен 28.05.2013

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

    курсовая работа [466,4 K], добавлен 20.01.2010

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

    курсовая работа [297,6 K], добавлен 10.03.2015

  • Специфика построения и минимизации детерминированного автомата методом разбиения. Построение детерминированной сети Петри, моделирующей работу распознающего автомата. Особенности программной реализации праволинейной грамматики, построение ее графа.

    курсовая работа [615,1 K], добавлен 19.06.2012

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

    дипломная работа [1,8 M], добавлен 18.08.2013

  • Понятие, последовательность построения и схемная реализация цифрового автомата. Описание форм представления функций алгебры логики. Принципы минимизации функций выходов и переходов автомата, их перевода в базис. Сведенья о программе Electronics Workbench.

    курсовая работа [2,0 M], добавлен 27.10.2010

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

    курсовая работа [903,9 K], добавлен 14.07.2012

  • Обоснование выбора языка, виды языков программирования. Характеристика программного продукта, постановка задачи, методы решения, программная реализация, программная документация. Руководство по использованию программы. Защита программного продукта.

    дипломная работа [1,6 M], добавлен 22.02.2010

  • Разработка управляющего автомата процессора с жесткой логикой в САПР Quartus II. Построение схемы функциональной микропрограммы команды "Исключающее ИЛИ" в размеченном виде. Унитарное кодирование состояний автомата. Запись функций переходов и выходов.

    курсовая работа [671,3 K], добавлен 04.11.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.