%%% Parsing arithmetic expressions
%%% Author: Roberto Virga

%use equality/strings.

digit : string -> type.

d0 : digit "0".
d1 : digit "1".
d2 : digit "2".
d3 : digit "3".
d4 : digit "4".
d5 : digit "5".
d6 : digit "6".
d7 : digit "7".
d8 : digit "8".
d9 : digit "9".

number : string -> type.

nd  : number X
        <- digit X.

n++ : number (X ++ Y)
        <- digit X
        <- number Y.

expression : string -> type.

en : expression X
       <- number X.

e~ : expression ("~" ++ X)
       <- expression X.

e* : expression (X ++ "*" ++ Y)
       <- expression X
       <- expression Y.

e+ : expression (X ++ "+" ++ Y)
       <- expression X
       <- expression Y.

e- : expression (X ++ "-" ++ Y)
       <- expression X
       <- expression Y.

e/ : expression (X ++ "/" ++ Y)
       <- expression X
       <- expression Y.

ep : expression ("(" ++ X ++ ")")
       <- expression X.
