Лабораторная работа 5. Подсчет значения арифметического выражения
Необходимо реализовать класс Calculator, реализующий подсчет значения арифметического выражения методом рекурсивного спуска.
Проект должен состоять их трёх файлов:
- Arithm. h — описание класса Calculator; Arithm. cpp — реализация методов класса Calculator; Main. cpp — содержит функцию main, в которой создаются объекты и осуществляется тестирование.
Ниже приведены фрагменты описания классов с перечислением методов, которые необходимо реализовать.
· Заголовочный файл Arithm. h:
namespace ArithmExpr
{
enum LexemType
{
Number,
Plus,
Minus,
Multiplication,
Division,
Open,
Close,
End
};
class Calculator
{
private:
FILE *inp;
LexemType curLexem;
int val;
void NextLexem();
int Expression();
int Summand();
int Factor();
public:
int Calculate(FILE *inp);
};
namespace Exceptions
{
struct UnexpectedSymbol {};
struct SyntaxError {};
struct DivisionByZero {};
};
};
В данной лабораторной работе необходимо реализовать подсчет значения арифметического выражения методом рекурсивного спуска, основанный на формулах Бэкуса-Науэра, задающих соответствующую грамматику:
<Выражение> ::= <слагаемое> {(+|-) <слагаемое>}
<Слагаемое> ::= <множитель> {(*|/) <множитель>}
<Множитель> ::= <число> {(<выражение>)}
Ниже приводится краткое описание некоторых методов класса Calculator:
- int Calculate(FILE *inp) — возвращает значение арифметического выражения, записанного в inp. void NextLexem() — считывает очередную лексемму, выставляя значения curLexem и при необходимости val. int Expression() — вычисляет значение <выражения>. int Summand() — вычисляет значение <слагаемого>. int Factor() — вычисляет значение <множителя>.
Программа должна осуществлять проверку корректности введенного арифметического выражения. При обнаружении ошибки в зависимости от ее характера должно выкидываться исключение одного из трех вышеописанных типов, в обработчиках которых выдается соответствующее сообщение об ошибке:
· “Division by zero” — при делении на ноль;
· “Unexpected symbol” — если в выражении встречаются символы, отличные от цифр, знаков арифметических операций, круглых скобок, пробельных симовлов;
· “Syntax error” — при других синтаксических ошибках.
Гарантируется, что вводимые выражения могут быть однозначно расклассифицированы по этим трем группам.
Примечания:
· Описание алгоритма подсчета значения арифметического выражения методом рекурсивного спуска можно найти на странице практикума.


