The parser I used is a library called Lark. It was relatively easy to get up and running, except for the implicit precedence of the tokens! Lark's algorithm is bottom-up: it parses tokens first then figures out where they fit. If your tokens are ambiguously defined (e.g. a
