The goal of this exercise it to have a minimal parser which will parse expressions as the ML languages do.
Namely to have function application to have the highest priority. The key to this seems to have a minimal set of productions
base rule. The
app rule defines that application groups to the left.
Syntax module has the following interpretation:
Int-s are numbers,
Fn-s are predefined function names and
Plus have the obvious and natural meaning.
A way to test it is to run
mehnir --interpret --interpret-show-cst parser.mly
Some examples where first line is the input the rest is
FN INT PLUS FN INT ACCEPT [parse: [expr: [arith: [expr: [app: [base: FN] [base: INT]]] PLUS [expr: [app: [base: FN] [base: INT]]] ] ] EOF ]
Which shows the a hypothetical expression
exp2 10 + log10 100 will be parsed as we expect it to be parsed.
And a simpler example to demonstrate that currying works too:
FN INT INT ACCEPT [parse: [expr: [app: [app: [base: FN] [base: INT]] [base: INT]]] EOF ]
Which shows how something like
exp 2 10 will be parsed. As
((exp 2) 10) which is exactly what ML does.