The Language Grammar
Now we've got a lot of the boilerplate set up, we can start trying to figure out what our language's grammar should look like.
The easiest way to do this is by writing out a bunch of example use cases.
# This is a comment
5 * (3+4) # You can do the usual arithmetic stuff
x = 3*PI/4 # and read/write variables
y = sin(x)^2 # plus call functions
While this language won't be turing complete (we don't have conditionals or loops), it should be a fairly decent calculator.
Once you have several examples the next step is to formalize the language grammar to make it easier to parse. This is usually done by writing a bunch of "rules" in [Backus-Naur Form][bnf].
expr := <term>
| "(" <expr> ")"
| <function-call>
term := <factor>
| <term> "+" <term>
| <term> "-" <term>
factor := NUMBER
| IDENTIFIER
| <factor> "*" <factor>
| <factor> "/" <factor>
function-call := IDENTIFIER "(" <arg-list> ")"
arg-list := EPSILON
| <expr> ("," <expr>)*
To put it in human terms, we would read the first rule as saying "an expr is either a term, an expr surrounded by parentheses, or a function call".