Fix regeneration of multi-file dependencies
[hcoop/domtool2.git] / src / domtool.grm
index 17ad3c1..bd2726c 100644 (file)
@@ -31,9 +31,10 @@ open Ast
  | ARROW | DARROW | LARROW
  | COLON | CARET | BANG | AND
  | LPAREN | RPAREN | LBRACK | RBRACK | LBRACE | RBRACE
- | EQ | COMMA | BSLASH | SEMI | LET | IN | END
- | ROOT
- | EXTERN | TYPE | VAL | WITH | WHERE
+ | EQ | COMMA | BSLASH | BSLASHBSLASH | SEMI | LET | IN | BEGIN | END
+ | IF | THEN | ELSE
+ | ROOT | SKIP
+ | EXTERN | TYPE | VAL | WITH | WHERE | CONTEXT
 
 %nonterm 
    file of file
@@ -53,6 +54,7 @@ open Ast
  | ctxt of pred
  | recd of record
  | recdNe of record
+ | SEMIopt of unit
 
 %verbose                                (* print summary of errors *)
 %pos int                                (* positions *)
@@ -63,6 +65,7 @@ open Ast
 
 %name Domtool
 
+%nonassoc THEN ELSE
 %right SEMI
 %nonassoc COLON
 %nonassoc IN
@@ -76,24 +79,24 @@ open Ast
 
 %%
 
-file   : decls expOpt                      (decls, expOpt)
+file   : docOpt decls expOpt               (docOpt, decls, expOpt)
 
 decls  :                                   ([])
-       | decl SEMI decls                   (decl :: decls)
+       | decl decls                        (decl :: decls)
 
-decl   : decl' docOpt                      (decl', docOpt, (decl'left, docOptright))
+decl   : decl' SEMI docOpt                 (decl', docOpt, (decl'left, docOptright))
 
 decl'  : EXTERN TYPE SYMBOL                (DExternType SYMBOL)
        | EXTERN VAL SYMBOL COLON typ       (DExternVal (SYMBOL, typ))
        | VAL SYMBOL EQ exp                 (DVal (SYMBOL, NONE, exp))
        | VAL SYMBOL COLON typ EQ exp       (DVal (SYMBOL, SOME typ, exp))
+       | CONTEXT CSYMBOL                   (DContext CSYMBOL)
 
 docOpt :                                   (NONE)
        | DOC                               (SOME DOC)
 
 expOpt :                                   (NONE)
-       | exp                               (SOME (ELocal (exp, (ESkip, (expleft, expright))),
-                                                 (expleft, expright)))
+       | exp                               (SOME exp)
 
 
 exp    : apps                              (apps)
@@ -113,6 +116,8 @@ exp    : apps                              (apps)
        | 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))
+       | BSLASHBSLASH SYMBOL COLON ctxt ARROW exp (EALam (SYMBOL, ctxt, exp),
+                                                         (BSLASHBSLASHleft, expright))
        | CSYMBOL EQ exp                    (ESet (CSYMBOL, exp), (CSYMBOLleft, expright))
        | exp SEMI exp                      (let
                                                val ls = case #1 exp2 of
@@ -121,28 +126,30 @@ exp    : apps                              (apps)
                                            in
                                                (ESeq ls, (exp1left, exp2right))
                                            end)
-       | SYMBOL LARROW CSYMBOL SEMI exp    (EGet (SYMBOL, CSYMBOL, exp), (SYMBOLleft, expright))
-       (*| exp WHERE exp END                 (ELocal (exp1, exp2), (exp1left, ENDright))
-       | exp WHERE exp WITH END            (EWith ((ELocal (exp1, exp2), (exp1left, ENDright)),
-                                                  (ESkip, (WITHleft, ENDright))),
-                                           (exp1left, ENDright))
-       | exp WITH END                      (EWith (exp, (ESkip, (WITHleft, ENDright))), (expleft, ENDright))
-       | exp WITH exp END                  (EWith (exp1, exp2), (exp1left, ENDright))*)
+       | exp SEMI                          (exp)
+       | SYMBOL LARROW CSYMBOL SEMI exp    (EGet (SYMBOL, NONE, CSYMBOL, exp), (SYMBOLleft, expright))
+       | SYMBOL COLON typ LARROW CSYMBOL SEMI exp (EGet (SYMBOL, SOME typ, CSYMBOL, exp), (SYMBOLleft, expright))
+       | IF exp THEN exp ELSE exp END      (EIf (exp1, exp2, exp3), (IFleft, ENDright))
 
 apps   : term                              (term)
        | apps term                         (EApp (apps, term), (appsleft, termright))
 
 term   : LPAREN exp RPAREN                 (exp)
+       | BEGIN exp END                     (exp)
        | INT                               (EInt INT, (INTleft, INTright))
        | STRING                            (EString STRING, (STRINGleft, STRINGright))
        | LBRACK elist RBRACK               (EList elist, (LBRACKleft, RBRACKright))
        | LET exp IN exp END                (ELocal (exp1, exp2), (LETleft, ENDright))
        | SYMBOL                            (EVar SYMBOL, (SYMBOLleft, SYMBOLright))
+       | SKIP                              (ESkip, (SKIPleft, SKIPright))
 
-sets   : CSYMBOL EQ apps                   ([(ESet (CSYMBOL, apps), (CSYMBOLleft, appsright))])
+sets   : CSYMBOL EQ apps SEMIopt           ([(ESet (CSYMBOL, apps), (CSYMBOLleft, appsright))])
        | CSYMBOL EQ apps SEMI sets         ((ESet (CSYMBOL, apps), (CSYMBOLleft, appsright))
                                            :: sets)
 
+SEMIopt: SEMI                              ()
+       |                                   ()
+
 elist  :                                   ([])
        | elistNe                           (elistNe)