Проектирование лексического анализатора

Автор работы: Пользователь скрыл имя, 02 Апреля 2013 в 23:51, курсовая работа

Краткое описание

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

Содержание

Введение 2
1 Организация таблицы идентификаторов 3
1.1 Исходные данные 3
1.2 Назначение таблиц идентификаторов 3
1.3 Метод цепочек 3
1.4 Метод бинарного дерева 7
1.5 Результаты 9
2 Проектирование лексического анализатора 10
2.1 Исходные данные 10
2.2 Принципы работы лексических анализаторов 10
2.3 Схема распознавателя 11
2.4 Результаты 12
3 Построение дерева вывода 13
3.1 Исходные данные 13
3.2 Синтаксический анализатор 13
3.3 Результаты 17
Заключение 19
Список использованных источников 20
Приложение А. Граф состояний лексического анализатора 21
Приложение Б. Матрица операторного предшествования 22
Приложение В. Исходный текст программы 23

Вложенные файлы: 5 файлов

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА.doc

— 148.00 Кб (Просмотреть документ, Скачать файл)

Приложение А.doc

— 109.50 Кб (Просмотреть документ, Скачать файл)

Приложение Б.doc

— 152.00 Кб (Просмотреть документ, Скачать файл)

Приложение В.doc

— 256.00 Кб (Скачать файл)

curRuleStruct.node = treeItem; //помещаем указатель на узел дерева (нетерминал)

rootTreeItem = treeItem; //на всякий случай запоминаем, как корневой узел

stack.push(curRuleStruct); //помещаем на верхушку стека нетерминал

stackSize++;

isRuleValid=1; //правило корректно

break; //выход из цикла

}

}

if (!isRuleValid) //если правило некорректно

{

QMessageBox::critical(0, "ERROR", tr("Не найдено соответствующее  правило, ошибка!"), "OK");

setError(lexDesc.stringNumber); //послать сообщение о синтаксической ошибке

}

 

}

}

 

//возвращает  терминал грамматики, соответствующий  текущей считываемой лексеме curLex

QString SynAnalyser::getStackItemText()

{

QString type = lexDesc.type;

if (type=="CONSTANT")

return "c";

else if (type=="ID")

return "a";

else

return lexDesc.text;

}

 

//верхний  терминал стека

QString SynAnalyser::getTopTerm()

{

QString text("");

if (stackSize<1) QMessageBox::critical(0, "ERROR", "Стек пуст!", "OK");

for (int i=stackSize-1; i>=0; i--)

{

stackItem sI;

sI = stack.at(i);

text = sI.text;

if ((text!="E") && (text!="B"))

break;

}

return text;

}

 

//получить номер столбца/строки терминала в матрице предшествования

int SynAnalyser::getTermNum(QString text)

{

int n;

if (text=="program")

n=0;

else if (text=="end.")

n=1;

else if (text==";")

n=2;

else if (text=="if")

n=3;

else if (text=="then")

n=4;

else if (text=="else")

n=5;

else if (text=="endif")

n=6;

else if (text=="begin")

n=7;

else if (text=="end")

n=8;

else if (text=="for")

n=9;

else if (text=="downto")

n=10;

else if (text=="do")

n=11;

else if (text=="a")

n=12;

else if (text=="c")

n=13;

else if (text==":=")

n=14;

else if (text=="or")

n=15;

else if (text=="and")

n=16;

else if (text=="not")

n=17;

else if (text=="<")

n=18;

else if (text==">")

n=19;

else if (text=="=")

n=20;

else if (text=="<>")

n=21;

else if (text=="(")

n=22;

else if (text==")")

n=23;

else if (text=="-")

n=24;

else if (text=="+")

n=25;

else if (text=="<<")

n=26;

else if (text==">>")

n=27;

else if ((text=="[") || (text=="]"))

n=28;

return n;

}

 

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

QChar SynAnalyser::getMatrixValue(QString tTerm, QString fLex)

{

int i = getTermNum(tTerm); //номер строки

int j = getTermNum(fLex); //номер столбца

    return matrix[i][j]; 

}

 

//сообщить  об ошибке

void SynAnalyser::setError(int stringNumber)

{

QMessageBox::critical(0, "ERROR", tr("Синтаксическая ошибка в %1 строке").arg(stringNumber), "OK");

emit sendLog(tr("Синтаксическая ошибка в %1 строке").arg(stringNumber), "ERROR");

emit setRedLine(stringNumber); //выделить красным строку с ошибкой

}

 

void SynAnalyser::getLexemes(QVector<lexemeDescription> lexemesDesc)

{

lexemes=lexemesDesc;

sendLog(tr("Приняты лексемы от лексического анализатора"), "MESSAGE");

 

}

 

void SynAnalyser::getIdentifiers(QMap<QString, int> ids)

{

identifiers=ids;

sendLog(tr("Приняты идентификаторы  от лексического анализатора"), "MESSAGE");

start(); //начать синтаксический анализ

}

 


Информация о работе Проектирование лексического анализатора