
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •1 Языковые процессоры
- •1.1 Практическое применениеискусственных языков
- •1.2 Практический пример
- •1.3 Понятие и структура языкового процессора
- •2Обзор существующих систем и обоснование выбора инструментальных средств и класса грамматики
- •2.1 Обзор существующей символьной спецификации моделей гс в среде исма
- •2.1.1 Лексемы языка исма
- •2.1.2 Грамматика языка исма
- •2.1.3 Семантические действия в языковом процессоре исма
- •2.1.4 Заключение
- •2.2 Обоснование выбора инструментальных средств и класса грамматики
- •3 Постановка задачи исследования
- •3.1 Характеристика задачи исследования
- •3.2 Входная информация
- •3.3 Выходная информация
- •3.4 Архитектура среды исма с расширенным языком описания гс
- •4 Программно-математическое обеспечение
- •4.1Лексический анализатор
- •4.1.1 Функции лексического анализатора
- •4.1.2 Спецификация токенови входного алфавита символов
- •4.1.3 Распознавание токенов
- •4.1.4 Иерархия классов модуля
- •4.2 Синтаксический анализатор
- •4.2.1 Функции синтаксического анализатора
- •4.2.2 Спецификация грамматики
- •4.2.3 Метод разбора
- •4.2.4 Восстановление после ошибок
- •4.2.5 Иерархия классов модуля
- •4.3 Семантический анализ
- •4.3.1 Промежуточное представление программы
- •4.3.2 Грамматика с семантическими правилами
- •4.3.3 Модифицированныйметодразбора
- •4.3.4 Семантический анализ. Таблица символов
- •4.3.5 Семантический анализ. Проверка корректности типа
- •4.4 Генерация кода
- •4.5 Система сбора диагностических сообщений
- •5 Тестирование
- •5.1 Лексический анализатор
- •5.2 Синтаксическийанализатор
- •5.3 Семантический анализатор
- •Заключение
- •Список использованных источников
- •ПриложениеA Диагностические сообщения
- •Диагностические сообщения сканера
- •Диагностические сообщения парсера
- •Диагностические сообщения семантического анализатора
- •ПриложениеБ
- •Б.1.3 Установка системы
- •Б.2 Работа с системой б.2.1 Запуск системы и начало работы
- •Б.2.2Ввод программной модели
- •Б.2.3Трансляция модели и просмотр результата
- •Б.2.4Сохранение программной модели
- •Б.2.6Завершение работы с системой
- •Приложение в
- •Листинг программы
- •В.1 Модуль лексического анализатора
- •Файл abstractLexer.H
- •Файл lexer.H
- •Файл lexer.Cpp
- •В.2 Модуль синтаксического анализатора Файл abstractParser.H
- •Файлparser_ll1.H
- •Файл parser_ll1.Cpp
- •В.3 Модуль семантического анализатора Файл symbolTable.H
- •Файл SymbolTableFactory.H
- •Файл checker.H
- •В.4 Модулькодогенератора ФайлastVisitor.H
- •Файл astCodeGen.H
В.3 Модуль семантического анализатора Файл symbolTable.H
#ifndef SYMBOLTABLE_H
#define SYMBOLTABLE_H
#include <exception/syntax_error.h>
#ifdef IS_UNIX
#include <tr1/unordered_map> /// WINDOWS
#else
#include <unordered_map>
#endif
namespace std{
using tr1::unordered_map;
}
namespace parser_LL1{
class ObjType;
using std::string;
typedef std::unordered_map<string,ObjType *> hashmap;
class SymbolTable{
private:
hashmap table;
public:
SymbolTable(){}
ObjType* lookup(const string& word){
hashmap::const_iterator i = table.find(word);
if( i != table.end() ) return i->second;
return 0;
}
ObjType* get(const string& word){
hashmap::const_iterator i = table.find(word);
if( i != table.end() ) return i->second;
else throw error::Parser_error("Identifier not found: " + word);
}
void add(const string& word,ObjType* x){
hashmap::const_iterator i = table.find(word);
if( i != table.end() ) throw error::Parser_error("Identifier already exists: " + word); // error
table.insert(std::make_pair(word,x));
}
};
}// parser_LL1
#endif // SYMBOLTABLE_H
Файл SymbolTableFactory.H
#ifndef SYMBOLTABLEFACTORY_H
#define SYMBOLTABLEFACTORY_H
#include "symbolTable.h"
#include "ast/ast.h"
#include "ast/objType.h"
#include <vector>
namespace parser_LL1{
class SymbolTableFactory{
private:
Program* program;
std::vector<std::pair<int,int>>* makeList(ListExpr* l){
std::vector<std::pair<int,int>>* i=new std::vector<std::pair<int,int>>;
while(l!=0){
Interval* curr=dynamic_cast<Interval*>(l->first());
if(!curr) break;
i->push_back(std::make_pair(curr->lvalue(),curr->rvalue()));
l=dynamic_cast<ListExpr*>(l->rest());
}
return i;
}
public:
SymbolTableFactory(Node* pr){
this->program=dynamic_cast<Program*>(pr);
if(!program)
throw error::System_error("incorrect ast building parser - SymbolTableFactory");
}
SymbolTable* build(){
SymbolTable* t=new SymbolTable();
Seq* d=program->declarations();
// declarations - macro , array , const , count types
while(d!= 0){
Stmt* current=d->first();
if(current==0) break;
if(typeid(*current)== typeid(DeclMacro)){
DeclMacro* m=dynamic_cast<DeclMacro*>(current);
if(m->parametr() == 0){
t->add(m->identifier()->value(),new MacroType(m->macroexp()));
}else{
t->add(m->identifier()->value(),new MacroIndexType(m->parametr(),m->macroexp()));
}
} else if(typeid(*current)==typeid(DeclConst)){
DeclConst *c=dynamic_cast<DeclConst*>(current);
Expr* v=c->val()->reduce();
if(typeid(*v)== typeid(ConstantInt)){
t->add(c->idetifier()->value(),new ConstIntType(dynamic_cast<ConstantInt*>(v)->value()));
} else if(typeid(*v)== typeid(ConstantFloat)){
t->add(c->idetifier()->value(),new ConstFloatType(dynamic_cast<ConstantFloat*>(v)->value()));
}
} else if (typeid(*current)==typeid(DeclArray)){
DeclArray* a=dynamic_cast<DeclArray*>(current);
t->add(a->arr()->value(),new ArrayType(a->dimension()->value()));
} else if (typeid(*current)==typeid(DeclCount)){
DeclCount* cnt=dynamic_cast<DeclCount*>(current);
t->add(cnt->count()->value(),new CountType(makeList(cnt->listInter())));
}
d=dynamic_cast<Seq*>(d->rest());
}
Seq* cp=program->classicpart();
// implicit declaration in classic part - var type
while(cp!=0){
Stmt* current=cp->first();
if(current==0) break;
if(typeid(*current)== typeid(Equation)){
Equation* e=dynamic_cast<Equation*>(current);
ObjType * l= t->lookup(e->lval()->value());
if( l == 0){
t->add(e->lval()->value(),new VarType);
} else if(typeid(*l) != typeid(VarType) ){
e->lval()->error("lvalue isn't var type:"+e->lval()->value());
}
} else if( typeid(*current)== typeid(EquationIndex)){
EquationIndex* ei=dynamic_cast<EquationIndex*>(current);
ObjType* l=t->get(ei->lval()->arr()->value());
if(typeid(*l)!= typeid(ArrayType)){
ei->lval()->error("indexing for no array type:"+ei->lval()->arr()->value());
}
}
cp=dynamic_cast<Seq*>(cp->rest());
}
// implicit declaration in hybrid part - var type
Seq* hp=program->hybridpart();
while(hp!=0){
Stmt* current=hp->first();
if(current==0) break;
LocalState* ls=dynamic_cast<LocalState*>(current);
Seq * body=ls->b();
while(body!=0){
Stmt* current=body->first();
if(current==0) break;
if(typeid(*current)== typeid(Equation)){
Equation* e=dynamic_cast<Equation*>(current);
ObjType * l= t->lookup(e->lval()->value());
if( l == 0){
t->add(e->lval()->value(),new VarType);
} else if(typeid(*l) != typeid(VarType) ){
e->lval()->error("lvalue isn't var type:"+e->lval()->value());
}
} else if( typeid(*current)== typeid(EquationIndex)){
EquationIndex* ei=dynamic_cast<EquationIndex*>(current);
ObjType* l=t->get(ei->lval()->arr()->value());
if(typeid(*l)!= typeid(ArrayType)){
ei->error("indexing for no array type:"+ei->lval()->arr()->value());
}
}
body=dynamic_cast<Seq*>(body->rest());
}
hp=dynamic_cast<Seq*>(hp->rest());
}
d=program->declarations();
while(d!=0){
Stmt* current=d->first();
if(current==0) break;
if(typeid(*current) == typeid(SetGlobal) ){
SetGlobal* sg=dynamic_cast<SetGlobal*>(current);
ObjType * l= t->lookup(sg->lval()->value());
if( l == 0){
Expr* rval=sg->body()->reduce();
if(typeid(*rval)== typeid(ConstantInt)){
t->add(sg->lval()->value(),new ConstIntType(dynamic_cast<ConstantInt*>(rval)->value()));
} else if(typeid(*rval)== typeid(ConstantFloat)){
t->add(sg->lval()->value(),new ConstFloatType(dynamic_cast<ConstantFloat*>(rval)->value()));
}
delete rval;
} else if(typeid(*l) != typeid(VarType)){
sg->lval()->error("lvalue isn't var type:"+sg->lval()->value());
}
} else if(typeid(*current) == typeid(SetGlobalIndex)){
SetGlobalIndex* sgi=dynamic_cast<SetGlobalIndex*>(current);
if(typeid(*t->get(sgi->lval()->arr()->value()))!=typeid(ArrayType)){
sgi->lval()->error("indexing for no array type:"+sgi->lval()->arr()->value());
}
}
d=dynamic_cast<Seq*>(d->rest());
}
return t;
}
};
}// parser_LL1
#endif // SYMBOLTABLEFACTORY_H