- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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
Файл lexer.Cpp
#include "lexer.h"
inline bool lexer::Lexer::readch()
{
return in.get(peek);
}
inline bool lexer::Lexer::readch(char c)
{
if(!readch()) return false;// END
if(peek != c) return false;
peek = ' ';
return true;
}
inline void lexer::Lexer::error(Type_error type )
{
static logger::Logger & diag=logger::Logger::getLogger();
string prefix_msg="lexer error - "+getLine()+": ";
switch(type){
case INVAL_NE: diag.log(prefix_msg+"undefined symbol "+"\'!\'"); break;
case UNDEF_SYM: diag.log(prefix_msg+"undefined symbol "+"\'"+peek+"\'");readch(); break;
case DECIM_POINT: diag.log(prefix_msg+"expected digit after decimal separator");break;
case EXPON: diag.log(prefix_msg+"expected digit after exponent");break;
case INVAL_SUFF: diag.log(prefix_msg + "invalid suffix on constant");skipAlpha();break;
}
}
void lexer::Lexer::skipAlpha()
{
while( readch() && isalpha(peek) );
}
std::string lexer::Lexer::getLine() const
{
char buff[10];
sprintf_s(buff,"%d",line);
return string(buff);
}
inline void lexer::Lexer::warning(const string &info)
{
logger::Logger::getLogger().log("lexer warning - "+getLine()+": "+info);
}
lexer::shared_ptr<lexer::Token> lexer::Lexer::scan()
{
for( ; ; readch() ){
if(in.eof()) {
return shared_ptr<Token>(new Token(Token::END));
}
if( peek == ' '||peek == '\t') continue;
else if( peek == '\n') line = line+1;
else break;
}
switch(peek){
case '/' :
if(readch('/')){ // skip comments
for( ; ; readch() ){
if(in.eof()) {
return shared_ptr<Token>(new Token(Token::END));
}
if( peek == '\n'){
break;
}
}
return scan();
} else return shared_ptr<Token>(new Token(Token::Tag('/')));
case '!' :
if(readch('=')) return shared_ptr<Token>(new Token(Token::NE));
else {
error(INVAL_NE); // invalid NotEqual;
return scan();
}
case '=' :
if( readch('=')) return shared_ptr<Token>(new Token(Token::EQ));
else return shared_ptr<Token>(new Token(Token::Tag('=')));
case '<' :
if(readch())
switch(peek){
case '=': peek=' '; return shared_ptr<Token>(new Token(Token::LE));
case '>': peek=' '; return shared_ptr<Token>(new Token(Token::NE));
default:
;
}
return shared_ptr<Token>(new Token(Token::Tag('<')));
case '>' :
if( readch('=')) return shared_ptr<Token>(new Token(Token::GE));
else return shared_ptr<Token>(new Token(Token::Tag('>')));
case '*' :
case '+' :
case '-' :
case '(' :
case ')' :
case '[' :
case ']' :
case ',' :
case ';' :
case '\'': // symbol '
case '~' :
char temp; temp=peek;
peek = ' ';
return shared_ptr<Token>(new Token(Token::Tag(temp)));
default:
if(isdigit(peek)) {
bool flag_float=0;
std::string str_number;
// before decimal point
do {
str_number.push_back(peek);
} while (readch() && isdigit(peek));
// after decimal point
if(peek == '.') {
str_number.push_back(peek);
if(readch() && isdigit(peek)){
++flag_float;
do {
str_number.push_back(peek);
} while (readch() && isdigit(peek));
} else{
//error
error(DECIM_POINT);
// restore
str_number.push_back('0');
}
}
// after symbol of order
if(peek == 'E' || peek == 'e') {
str_number.push_back(peek);
if( readch() && (peek == '+' || peek == '-') ) {str_number.push_back(peek);readch();}
if(isdigit(peek)){
++flag_float;
do {
str_number.push_back(peek);
} while (readch() && isdigit(peek));
} else{
//error
error(EXPON);
// restore
str_number.push_back('0');
}
}
if(isalpha(peek)) error(INVAL_SUFF); // error
Token *num;
// for strtod(l)
errno=0;
double t=0.;
if( flag_float ) {num= new FloatLiteral( t=strtod(str_number.c_str(),0) );}
else num= new IntLiteral( int(strtol(str_number.c_str(),0,10)) );
if(errno){
if(flag_float)
if(t==0.0) warning("underflow float constant");
else warning("overflow float constant");
else
warning("overflow integer consant");
}
return shared_ptr<Token>(num);
}
if(isalpha(peek) || peek == '_') {
string str_ident;
do {
str_ident.push_back(peek);
} while( readch() && ( isalnum(peek) || peek == '_'));
hashmap::const_iterator i = words.find(str_ident);
if( i != words.end() )
return i->second;
shared_ptr<Word> w(new Word(Token::ID, str_ident));
words.insert(std::make_pair(str_ident,w));
return w;
}
error(UNDEF_SYM); return scan();
}
}
