Попробуйте набросать автомат, который обнаруживает выражения.
После этого самым простым способом реализации автоматов был бы switch..case с вложенным if..else.
Я думаю, что это было бы намного проще, чем анализировать строку, как вы сейчас.
Edit -
Это очень простой пример, только для демонстрации. предположим, что я хочу обнаружить выражения в виде var1 + var2, автоматы будут выглядеть так:
Изображение
Реализация выглядит следующим образом:
done = false;
state = start;
while(!done)
{
switch(state)
{
case start:
if(expression[i] > 'a' && expression[i] < 'z')
state = start;
else if(expression[i] == '+')
{
// seen first operand and waitng for second
// so we switch state
state = add;
}
break;
case add:
if(expression[i] > 'a' && expression[i] < 'z')
state = add;
else
done = true;
break;
}
}
Как я уже сказал, это очень просто, ваши автоматы будут более сложными с большим количеством состояний и переходов. Я также не включил здесь действия, но вы можете сделать фактическое добавление после того, как прочитан второй операнд, который после done = true;