I'm very glad you asked. I wrote my own parser combinator library in TypeScript partly based on eulalie[0], so it doesn't have a separate lexer and parser and doesn't rely heavily on regexes (though it does use them to do things like match a single alphanumeric character). I plan on open sourcing this library one day once I can tidy up the API because I think it would be useful to other people.
But to give you an idea of what that all looks like this is the code for the parser that parses the "as a % of" operator:
append(
string("as"),
oneOrMore(space),
optional(append(string("a"), oneOrMore(space))),
percentSymbol,
oneOrMore(space),
string("of")
)
[0] https://github.com/bodil/eulalie