Began to implement identifier lexing
Lex these as identifier symbols: - + *
Lex | as pipe
Parse = as identifier, not its own type of token
Lex all other symbols which are identifier-valid
Parse . and ; as dot and semicolon tokens
Broken again! How do you make these pass?

This is the point at which your suggestion of compound matchers may be
necessary. Or can you find a simpler way to do it? They held up well for
identifiers so far... What about some more complex items?