#include "calculator.h" #include #include #define DELIMITER 1 #define VARIABLE 2 #define NUMBER 3 #define COMMAND 4 #define STRING 5 #define QUOTE 6 #define FINISHED 10 #define EOL 9 Calculator::Calculator(VContainer *data){ index = 0; this->data = data; } qreal Calculator::eval(QString prog){ debugFormula.clear(); this->prog = prog; qDebug()<<"Формула: "<0; --t) // *r = (*r) * ex; break; } } /* Изменение знака */ void Calculator::unary(QChar o, qreal *r){ if(o=='-') *r = -(*r); } /* Поиск значения переменной */ qreal Calculator::find_var(QString s){ bool ok = false; qreal value = data->FindVar(s, &ok); if(!ok){ serror(4); /* не переменная */ return 0; } return value; } /* выдать сообщение об ошибке */ void Calculator::serror(qint32 error){ QString e[]= { "Синтаксическая ошибка", "Непарные круглые скобки", "Это не выражение", "Предполагается символ равенства", "Не переменная", "Таблица меток переполнена", "Дублирование меток", "Неопределенная метка", "Необходим оператор THEN", "Необходим оператор TO", "Уровень вложенности цикла FOR слишком велик", "NEXT не соответствует FOR", "Уровень вложенности GOSUB слишком велик", "RETURN не соответствует GOSUB" }; qDebug()</*%^=()",c) || c=='\n' || c=='\r' || c=='\0') return true; return false; } /* Возвращает 1, если "с" пробел или табуляция */ bool Calculator::iswhite(QChar c){ if(c==' ' || c=='\t') return true; else return false; } void Calculator::get_token(){ QString *temp; token_type=0; tok=0; token.clear(); temp=&token; if(prog[index]=='\0') { /* Конец файла */ token="\0"; tok=FINISHED; token_type=DELIMITER; return; } while(iswhite(prog[index])) ++index; /* пропуск пробелов */ if(prog[index]=='\r') { /* crtl */ ++index; ++index; tok= EOL; token='\r'; token.append('\n');token.append("\0"); token_type = DELIMITER; return; } if(StrChr("+-*^/%=;(),><", prog[index])) { /* разделитель */ *temp=prog[index]; index++; /* переход на следующую позицию */ temp->append("\0"); token_type=DELIMITER; debugFormula.append(token); return; } if(prog[index]=='"') { /* строка в кавычках */ index++; while(prog[index] != '"' && prog[index] != '\r'){ temp->append(prog[index]); index++; } if(prog[index]=='\r') serror(1); index++;temp->append("\0"); token_type=QUOTE; return; } if(prog[index].isDigit()) { /* число */ while(!isdelim(prog[index])){ temp->append(prog[index]); index++; } temp->append('\0'); token_type = NUMBER; return; } if(prog[index].isPrint()) { /* переменная или команда */ while(!isdelim(prog[index])){ temp->append(prog[index]); index++; } token_type=STRING; } temp->append("\0"); /* Просматривается, если строка есть команда или переменная */ if(token_type==STRING) { tok=look_up(token); /* преобразование во внутренний формат */ if(!tok) token_type = VARIABLE; else token_type = COMMAND; /* это команда */ } return; } bool Calculator::StrChr(QString string, QChar c){ return string.contains(c, Qt::CaseInsensitive); } /* Возвращает лексему обратно во входной поток */ void Calculator::putback(){ QString t; t = token; index = index - t.size(); }