Перепрошую, попередній коментар я надіслав із затримкою в 3 години, світло вимикали.
Ідемо далі. Prc.h. Що взагалі означає "prc"? Китайська Народна Республіка англійською? Назви мають бути змістовні.
Простір імен Lang. Мабуть, від language. Щось, пов'язане із мовою. Ну добре, припустимо.
enum class TOKEN_ID
{
TERM_PROD,
MULT,
BOB = NULL
};
Значеннями enum-а можуть бути лише цілі числа. NULL - посилання на адресу 0 - буде перетворене на число 0, і, відповідно, BOB і TERM_PROD означають одне й те саме. Вам саме так треба?
У класів є конструктори за замовчуванням. Загалом, я б сказав, це не дуже добре. Звісно, є безліч ситуацій, де такі конструктори потрібні, але наявність функції init без серйозного приводу - це вже не дуже добре. Скажімо, в тому ж main могло б бути
while (...)
{
getline(std::cin, input);
Lang::Prc lang_prc(input);
std::cout << ">>>\t" << lang_prc.get_last_out() << "\n";
}
Погодьтеся, дещо елегантніше - об'єкт створюється лише для того, щоб видати результат. Хоча, звісно, якщо конструктор кидає виключні ситуації, краще з init. А от нащо Token-у конструктор за замовчуванням - я не зрозумів. А ще Token та TOKEN_ID можуть бути приватними, їх ніби ніхто поза класом Prc бачити не має.
Так, переходимо до найцікавішого. prc.cpp.
Для початку - нащо вам потрібен id? Ви його ніде не використовуєте.
Списками ініціалізації ви теж чомусь не користуєтеся. Гм.
*(tokens.cend() - 1); має значно кращу назву - tokens.back(), а *tokens.cbegin() - це tokens.front().
Lexer. Тут у вас є кілька замикань, які оцінюють параметр (ще й дублюють стандартні функції з cctype) і змінюють захоплені змінні. Це погано і значно ускладнює зневадження. Причому ви ж самі вимушені писати порожнє тіло гілки if через це. Порівняйте ваш код
auto is_string = [&state](char symbol)
{
if ((symbol >= 'a' && symbol <= 'z') || (symbol >= 'A' && symbol <= 'Z'))
{
state = LEXER_STATE::STRING;
return true;
}
return false;
};
if (i != -1 && is_string(exp[i])) {}
і ось такий:
if (i!=-1 && isalpha(exp[i])) {
state = LEXER_STATE::STRING;
}
Правда, у другому мороки значно менше?
Так, я бачу, ви хочете одним is_correct робити одночасно купу справ. Але ви тільки себе плутаєте.