Грамматическая проблема с основным типом токена '('')'C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Грамматическая проблема с основным типом токена '('')'

Сообщение Anonymous »


Я работаю над упражнением по главе 6 в Bjarne ppp, 2-е изд. задача состоит в том, чтобы исправить ошибки в заданном коде для Calculator02buggy.cpp. Я считаю, что нашел все, кроме проблемы в Primary(), связанной с круглыми скобками (). всякий раз, когда я ввожу выражение с помощью (), оно отменяет все, что находится перед ними, и решает, что находится внутри () и за ними. пример: 5+5+5(10+10)-20=0 возможно я идиот, но ответ не должен быть 5+5+5(20)-20, 5+5+5*20-20, 5+5 +100-20=90.

**// работа с числами и круглыми скобками двойная первичная() { Токен т = ts.get(); в то время как (истина) { переключатель (t.kind) { case '(': // дескриптор '(' выражения ')' двойной d = выражение(); т = ts.get(); if (t.kind != ')') error("')' ожидается"); вернуть д; case '8': // мы используем '8' для обозначения числа вернуть t.значение; // возвращаем значение числа по умолчанию: error("Ожидается первичное"); } } }** ^^^^Я считаю, что моя проблема связана именно с этим^^^^ но вот остальная часть кода, на случай, если мне чего-то не хватает.

#include "std_lib_facilities.h" //------------------------------------------------ ------------------------------ токен класса { публика: вид чарца; // какой токен двойное значение; // для чисел: значение Token(char ch) // создаем токен из символа :вид(ч), значение(0) { } Token(char ch, double val) // создаем токен из char и double :вид(ч), значение(значение) { } }; //------------------------------------------------ ------------------------------ класс Token_stream { публика: Токен_поток(); Получить токен(); // получаем токен (get() определен в другом месте) недействительный возврат (токен t); // возвращаем токен частный: бул полный; // есть ли токен в буфере? Буфер токенов; // здесь мы сохраняем токен, возвращенный с помощью putback() }; //------------------------------------------------ ------------------------------ Token_stream::Token_stream() :full(false), buffer(0) // в буфере нет токена { } // Функция-член putback() возвращает свой аргумент в буфер Token_stream: void Token_stream::putback(Token t) { if (full) error("putback() в полный буфер"); буфер = т; // копируем t в буфер полный = правда; // буфер теперь заполнен } //------------------------------------------------ ------------------------------ Токен Token_stream::get() { if (full) { // у нас уже есть готовый токен? // удаляем токен из буфера полный = ложь; возвратный буфер; } чар ч; цин >> ч; // обратите внимание, что >> пропускает пробелы (пробел, новую строку, табуляцию и т. д.) переключатель (ч) { case '=': // для "печати" case 'x': // для "выхода" случай '(': случай ')': случай '+': случай '-': случай '*': случай '/': вернуть токен (ч); // позволяем каждому символу представлять себя случай '.': случай '0': случай '1': случай '2': случай '3': случай '4': случай '5': случай '6': случай '7': случай '8': случай '9': { cin.putback(ч); // возвращаем цифру во входной поток двойной вал; цин >> вал; // читаем число с плавающей запятой return Token('8', val); // пусть '8' представляет собой "число" } по умолчанию: error("Плохой токен"); } } //------------------------------------------------ ------------------------------ Token_stream ТС; // предоставляет методы get() и putback() //------------------------------------------------ ------------------------------ двойное выражение(); // объявление, чтобы функция Primary() могла вызывать выражение() //------------------------------------------------ ------------------------------ **// работа с числами и круглыми скобками двойная первичная() { Токен т = ts.get(); в то время как (истина) { переключатель (t.kind) { case '(': // дескриптор '(' выражения ')' двойной d = выражение(); т = ts.get(); if (t.kind != ')') error("')' ожидается"); вернуть д; case '8': // мы используем '8' для обозначения числа вернуть t.значение; // возвращаем значение числа по умолчанию: error("Ожидается первичное"); } } }** //------------------------------------------------ ------------------------------ // работа с *, / и % двойной термин() { двойной левый = основной (); Токен т = ts.get(); // получаем следующий токен из потока токенов в то время как (истина) { переключатель (t.kind) { случай '*': влево *= первичный(); т = ts.get(); перерыв; случай '/': { двойной d = основной (); if (d == 0) error("делить на ноль"); левый /= d; т = ts.get(); перерыв; } по умолчанию: ts.putback(т); // помещаем t обратно в поток токенов вернуться налево; } } } //------------------------------------------------ ------------------------------ // работа с + и - двойное выражение() { двойной левый = срок(); // читаем и оцениваем терм Токен т = ts.get(); // получаем следующий токен из потока токенов в то время как (истина) { переключатель (t.kind) { случай '+': влево += термин(); // оцениваем Term и добавляем т = ts.get(); перерыв; случай '-': влево -= срок(); // оцениваем Term и вычитаем т = ts.get(); перерыв; по умолчанию: ts.putback(т); // помещаем t обратно в поток токенов вернуться налево; // наконец: больше нет + или -: возвращаем ответ } } } //------------------------------------------------ ------------------------------ интервал основной() пытаться { двойное значение = 0; cout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»