Build a scanner that converts a source string into tokens for identifiers, decimal numbers, + - * /, parentheses, assignment, and end of input. Each token should retain its lexeme or value and the source offset where it began.
Define what characters are allowed in identifiers and how a decimal point is handled. Report invalid input with a position instead of silently dropping it. Add tests for empty input, multi-digit numbers, whitespace, and an unfinished decimal according to your chosen grammar.
After tokenization, predict the syntax tree for one expression with mixed operators. The linked chapter explains a scanner as one stage of a language implementation; parsing comes next.