I wrote Zooly a few years ago, at a time when I was still learning both functional programming and OCaml. The code could use some serious improvement.
Namely, I'd like to:
- transition to the Core library instead of Batteries Included
- Rewrite everything to move away from classes, which are rarely used in OCaml
- Simplify the implementation through common abstractions
That begin said, the code works, and I learnt a lot writing it. For this type of project, that's the best one could hope for, isn't it?
A general recursive-descent parser written in OCaml, and a small calculator built from it.
Zooly intentionally doesn't use the parsing tools built-in to OCaml in order to be an effective learning experience into writing a parser from scratch.
Rather than build a parser that can exclusively parse mathematical expressions, a number of general purpose parsers are defined that are capable of parsing any conceivable syntax. A grammar for a calculator is then built from these general parsing constructs in order to demonstrate their use.
Dependencies and Build Instructions
Zooly depends on OCaml Batteries Included and has been tested with Ocaml 4.00.1.
To build the byte-compiled version of Zooly:
ocamlbuild -use-ocamlfind zooly.byte
To build the native version:
ocamlbuild -use-ocamlfind zooly.native
>>> 2 + 3 5.000000 >>> 3 - 4 * 6.2 -21.800000 >>> sin(pi / 2) 1.000000 >>> cos(e^2) 0.448356 >>> cos(3, 4.5) ERROR: 'cos' expects 1 arguments >>> let x = 23 23.000000 >>> let y = 3 * (x - 4) 57.000000 >>> sin(x)^2 + cos(x)^2 1.000000 >>> tan(x + foobar) ERROR: No such variable 'foobar'
Positive and negative signs do not have the correct operator precedence. For example,
-2^4is evaluated as
Error messages could be significantly improved. It may be beneficial to add some sort of
requireddirective to indicate that after a certain point in a rule, the remainder of the rule must be satisfied (i.e., backtracking is not allowed).