Автор работы: Пользователь скрыл имя, 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
curRuleStruct.node = treeItem; //помещаем указатель на узел дерева (нетерминал)
rootTreeItem = treeItem; //на всякий случай запоминаем, как корневой узел
stack.push(curRuleStruct); //помещаем на верхушку стека нетерминал
stackSize++;
isRuleValid=1; //правило корректно
break; //выход из цикла
}
}
if (!isRuleValid) //если правило некорректно
{
QMessageBox::critical(0, "ERROR",
tr("Не найдено
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(
{
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(
{
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(
{
lexemes=lexemesDesc;
sendLog(tr("Приняты лексемы от лексического анализатора"), "MESSAGE");
}
void SynAnalyser::getIdentifiers(
{
identifiers=ids;
sendLog(tr("Приняты
start(); //начать синтаксический анализ
}