Я думаю, что у вас есть общая проблема с обнаружением таких вещей, как
E = T + E | T - E | T
Когда вы ищите T()
, и он терпит неудачу, вы пытаетесь снова искать T()
.Вы допустили эту ошибку и в большинстве других функций.
Правильная реализация для E()
будет ( обновлена после комментария Криса ):
if (T())
{
if (c == '+' || c == '-')
{
++c;
return E();
}
return true;
}
return false;
Давайте рассмотрим пример: «a = (3)»
A()
-> I()
возвращает true -> c == '='
-> E()
-> T()
возвращает true при разборе 3
после вызова P()
, который завершается вызовом E()
снова -> сейчас c == ')'
, поэтому нам нужно вернуть true в E()
, в противном случае, если мы вернем false, здесь остановится в P()
Надеюсь, это не слишком запутанно, но здесь трудно выразить это.Лучше всего, если вы нарисуете дерево разбора на листе бумаги для его визуализации.
Обновите снова : у вас похожая ситуация в T()
и F()