Андрей Шалыгин, после того, как функция завершает работу, управление возвращается в место, откуда функция была вызвана. При этом переменные, которые были инициализирована до этого вызова, имеют те же значения. Ты десять раз вызвал одну и ту же функцию, и она ни разу не была завершена. Затем случился return (возврат) и все эти 10 вызовов начали по цепочке завершаться в обратном порядке. Именно в этом смысл рекурсии.
На пальцах: есть строка "2 + 5*10", токенайзер превращает её в набор токенов(или лексем), то есть неких объектов 2,+,5,*,10. Он пропускает лишние пробелы, и предоставляет возможность в дальнейшем сфокусироваться именно на синтаксисе, а не на разборе строк. Можно представить токены так:
interface Token{}
class Number implements Token {
int value;
}
enum Operator implements Token{
PLUS, MINUS, MULTIPLY, DIVIDE;
}
interface Tokenizer {
List<Token> tokenize(String input);
}
В дальнейшем проверять, какой токен виден, можно по instanceof.