Right, a real shell obviously can't use strtok. If you're leaving out pipes, redirects, and any control flow, then separating a shell string into words for the argv[] array is fairly similar to lexing a C-escaped string (e.g. in C, Java, Python, JavaScript).
You have backslashes, single quotes, and double quotes basically. Traditionally this is done with switch statement in a loop in C.
But that is not a good approach for a real shell. Even inside double quotes you can have a fully recursive program, like:
$ echo "hi ${v1:-A${v2:-X${v3}Y}B}"
hi AXYB
Once you have recursion then you need some kind of parser, not just a lexer.