X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/dac62e84b324d2187ec9b9882efa47125d5599a4..75d4c2d6fb7996625d062f5949ceb2e66c0a70ab:/src/domtool.grm diff --git a/src/domtool.grm b/src/domtool.grm index cd899e1..c9cd837 100644 --- a/src/domtool.grm +++ b/src/domtool.grm @@ -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 + | EQ | COMMA | BSLASH | BSLASHBSLASH | SEMI | LET | IN | BEGIN | END + | IF | THEN | ELSE | ROOT - | EXTERN | TYPE | VAL | WITH | WHERE + | 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 *) @@ -76,15 +78,18 @@ 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) @@ -111,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 @@ -119,28 +126,29 @@ 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 (EIf (exp1, exp2, exp3), (IFleft, exp3right)) 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)) -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)