Simple example recursive-descent parser for expressions.

exp.sml -- parser
The lexical analysis function converts a char list into a Symbol list; to see this try, e.g.,
    use "exp.sml";
    lexical(explode "(1+2)*3-4/5+x");
The parser takes a Symbol list and produces a parse tree : Exp, e.g.,
    expression(lexical(explode "(1+2)*3-4/5+x"));
main.sml -- parse text from a file
wrapper for the parser, asks for a file name, opens it, calls the parser, e.g.,
    use "main.sml";
    run "data";
 
Note, these expressions include arithmetic (+, -, *, /), relational (=, <>, <=, >=, < >), and logical (and, or, not) operators.
 
And there is a syntax (and semantics) for a small programming language [here].