Basic type-checking
[hcoop/domtool2.git] / src / domtool.grm
index 3384492..1ad3a5b 100644 (file)
@@ -17,6 +17,7 @@
 *)
 
 (* Parser for Domtool configuration files *)
+
 open Ast
 
 %%
@@ -27,7 +28,8 @@ open Ast
  | SYMBOL of string | CSYMBOL of string
  | STRING of string
  | INT of int
- | ARROW | DARROW | COLON | CARET | BANG | AND
+ | ARROW | DARROW | LARROW
+ | COLON | CARET | BANG | AND
  | LPAREN | RPAREN | LBRACK | RBRACK | LBRACE | RBRACE
  | EQ | COMMA | BSLASH | SEMI | LET | IN | END
  | ROOT
@@ -41,7 +43,7 @@ open Ast
  | elistNe of exp list
  | clist of exp list
  | typ of typ
- | ctxt of context
+ | ctxt of pred
  | recd of record
  | recdNe of record
 
@@ -68,7 +70,9 @@ open Ast
 file   : exp                               (exp)
 
 exp    : apps                              (apps)
-       | BSLASH SYMBOL COLON LPAREN typ RPAREN ARROW exp (ELam (SYMBOL, typ, exp), (BSLASHleft, expright))
+       | BSLASH SYMBOL COLON LPAREN typ RPAREN ARROW exp (ELam (SYMBOL, SOME typ, exp),
+                                                         (BSLASHleft, expright))
+       | BSLASH SYMBOL ARROW exp           (ELam (SYMBOL, NONE, exp), (BSLASHleft, expright))
        | CSYMBOL EQ exp                    (ESet (CSYMBOL, exp), (CSYMBOLleft, expright))
        | exp SEMI exp                      (let
                                                val ls = case #1 exp2 of
@@ -77,6 +81,7 @@ exp    : apps                              (apps)
                                            in
                                                (ESeq ls, (exp1left, exp2right))
                                            end)
+       | SYMBOL LARROW CSYMBOL SEMI exp    (EGet (SYMBOL, CSYMBOL, exp), (SYMBOLleft, expright)) 
 
 apps   : term                              (term)
        | apps term                         (EApp (apps, term), (appsleft, termright))
@@ -85,18 +90,9 @@ term   : LPAREN exp RPAREN                 (exp)
        | INT                               (EInt INT, (INTleft, INTright))
        | STRING                            (EString STRING, (STRINGleft, STRINGright))
        | LBRACK elist RBRACK               (EList elist, (LBRACKleft, RBRACKright))
-       | LET exp IN exp END                (let
-                                               val ls = case (#1 exp1, #1 exp2) of
-                                                            (ESeq ls1, ESeq ls2) => ls1 @ ls2
-                                                          | (ESeq ls, _) => ls @ [exp2]
-                                                          | (_, ESeq ls) => exp1 :: ls
-                                                          | _ => [exp1, exp2]
-                                           in
-                                               (ELocal (ESeq ls, (exp1left, exp2right)),
-                                                (exp1left, exp2right))
-                                           end)
+       | LET exp IN exp END                (ELocal (ESeq [exp1, exp2], (LETleft, ENDright)),
+                                                   (LETleft, ENDright))
        | SYMBOL                            (EVar SYMBOL, (SYMBOLleft, SYMBOLright))
-       | CSYMBOL                           (EEnv CSYMBOL, (CSYMBOLleft, CSYMBOLright))
 
 elist  :                                   ([])
        | elistNe                           (elistNe)
@@ -107,11 +103,11 @@ elistNe: exp                               ([exp])
 typ    : SYMBOL                            (TBase SYMBOL, (SYMBOLleft, SYMBOLright))
        | LBRACK typ RBRACK                 (TList typ, (LBRACKleft, RBRACKright))
        | typ ARROW typ                     (TArrow (typ1, typ2), (typleft, typright))
-       | LBRACK ctxt RBRACK recd DARROW recd (TAction (ctxt, recd1, recd2), (ctxtleft, recd2right))
+       | LBRACK ctxt RBRACK recd DARROW recd (TAction (ctxt, recd1, recd2), (LBRACKleft, recd2right))
        | LBRACK ctxt RBRACK recd           (TAction (ctxt, recd, StringMap.empty),
-                                           (ctxtleft, recdright))
+                                           (LBRACKleft, recdright))
        | LBRACK ctxt RBRACK                (TAction (ctxt, StringMap.empty, StringMap.empty),
-                                           (ctxtleft, ctxtright))
+                                           (LBRACKleft, ctxtright))
        | LPAREN typ RPAREN                 (typ)
 
 recd   : LBRACE RBRACE                     (StringMap.empty)