This is a sample interactive calculator built using ML-Yacc and ML-Lex.

The calculator is defined by the files

  calc.lex       (* defines lexer *)
  calc.grm       (* defines grammar *)
  calc.sml       (* defines driver function, Calc.parse *)
  calc.mlb       (* ML Basis file *)

To compile this example, type the following commands

  mllex calc.lex
  mlyacc calc.grm
  mlton calc.mlb

in this directory. They will invoke ml-lex and ml-yacc to process the
lexer specification calc.lex and the grammar specification calc.grm
respectively.  Then it will compile the resulting SML source files

  calc.lex.sml
  calc.grm.sig
  calc.grm.sml

and the calc.sml file containing the driver code.

The end result of compiling these files is an executable file named
"calc", that is based on the structure Calc containing a top-level
driver function named parse.

  Calc.parse : unit -> unit

The calculator can be invoked by applying Calc.parse to the unit value.

  - Calc.parse();
  1+3;
  result = 4

The calculator reads a sequence of expressions from the standard input
and prints the value of each expression after reading the expression.
Expressions must be separated by semicolons.  An expression is not
evaluated until the semicolon is encountered.  The calculator
terminates when an end-of-file is encountered. There is no attempt to
fix input errors: a lexical error will cause exception LexError to be
raised, while a syntax error will cause ParseError to be raised.

NOTE: The ML Basis file calc.mlb mentions the ml-yacc library
(mlyacc-lib.mlb). MLton's search path should be configured so that this
library will be found.  This should normally be the case if MLton is
properly installed.
