Лабораторная работа 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” — при других синтаксических ошибках.

Гарантируется, что вводимые выражения могут быть однозначно расклассифицированы по этим трем группам.

Примечания:

·  Описание алгоритма подсчета значения арифметического выражения методом рекурсивного спуска можно найти на странице практикума.