Программная реализация абстрактного автомата для транслятора языка высокого уровня
Исследование теории формальных языков. Характеристика объектно-атрибутной архитектуры для реализации абстрактного автомата и транслятора языка. Особенность создания архитектуры автомата. Разработка виртуальных устройств и их программная реализация.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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