Сложение, вычитание и скобки
Усложним предыдущий пример. Пусть теперь помимо чисел и знаков "плюс" и "минус", в выражении допустимо использование круглых скобок любой вложенности.
Во-первых, для корректной работы программы в этом случае потребуется модифицировать функцию get_next_lexem(), чтобы она "научилась" распознавать лексемы типа LT_OPEN и LT_CLOSE
Во-вторых, потребуется изменить функцию evaluate_expression(). При этом будем воспользуемся следующим наблюдением: часть выражения, заключенная в скобки, тоже является выражением, поэтому можно использовать функцию evaluate_expression() рекурсивно.
На рисунке разными цветами показаны области, для вычисления которых будут использоваться отдельные вызовы функции evaluate_expression().

Изменения коснутся функций calc_plus() и calc_plus().
Функция calc_minus() изменяется аналогично.
Также должна немного измениться основная логика функции evaluate_expression()
Теперь эту функцию могут вызвать для разбора основного выражения (признаком конца которого является LT_END, или для разбора выражения в скобках, признаком конца которого является LT_CLOSE.
Следует отдельно уделить внимание частному случаю, когда основное выражение начинается со скобки. Для этого потребуется внести изменения в начало функции evaluate_expression()