(* HCoop Domtool (http://hcoop.sourceforge.net/) * Copyright (c) 2006, Adam Chlipala * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *) (* Parser for Domtool configuration files *) open Ast %% %header (functor DomtoolLrValsFn(structure Token : TOKEN)) %term EOF | SYMBOL of string | CSYMBOL of string | STRING of string | DOC of string | INT of int | ARROW | DARROW | LARROW | COLON | CARET | BANG | AND | LPAREN | RPAREN | LBRACK | RBRACK | LBRACE | RBRACE | EQ | COMMA | BSLASH | BSLASHBSLASH | SEMI | LET | IN | END | ROOT | EXTERN | TYPE | VAL | WITH | WHERE | CONTEXT %nonterm file of file | decls of decl list | decl of decl | decl' of decl' | docOpt of string option | expOpt of exp option | exp of exp | apps of exp | term of exp | sets of exp list | elist of exp list | elistNe of exp list | clist of exp list | typ of typ | ctxt of pred | recd of record | recdNe of record %verbose (* print summary of errors *) %pos int (* positions *) %start file %pure %eop EOF %noshift EOF %name Domtool %right SEMI %nonassoc COLON %nonassoc IN %right ARROW DARROW %right COMMA %nonassoc EQ %right WITH %right WHERE %right AND %nonassoc CARET BANG %% file : docOpt decls expOpt (docOpt, decls, expOpt) decls : ([]) | decl decls (decl :: decls) 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 : apps (apps) | apps WHERE sets END (ELocal ((ESeq sets, (setsleft, setsright)), apps), (appsleft, ENDright)) | apps WITH END (EWith (apps, (ESkip, (WITHleft, ENDright))), (appsleft, ENDright)) | apps WITH exp END (EWith (apps, exp), (appsleft, ENDright)) | apps WHERE sets WITH END (ELocal ((ESeq sets, (setsleft, setsright)), (EWith (apps, (ESkip, (WITHleft, ENDright))), (appsleft, ENDright))), (appsleft, ENDright)) | apps WHERE sets WITH exp END (ELocal ((ESeq sets, (setsleft, setsright)), (EWith (apps, exp), (appsleft, ENDright))), (appsleft, ENDright)) | 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 ESeq ls => exp :: ls | _ => [exp1, exp2] in (ESeq ls, (exp1left, exp2right)) end) | exp SEMI (exp) | SYMBOL LARROW CSYMBOL SEMI exp (EGet (SYMBOL, CSYMBOL, exp), (SYMBOLleft, expright)) apps : term (term) | apps term (EApp (apps, term), (appsleft, termright)) 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 (ELocal (exp1, exp2), (LETleft, ENDright)) | SYMBOL (EVar SYMBOL, (SYMBOLleft, SYMBOLright)) sets : CSYMBOL EQ apps ([(ESet (CSYMBOL, apps), (CSYMBOLleft, appsright))]) | CSYMBOL EQ apps SEMI sets ((ESet (CSYMBOL, apps), (CSYMBOLleft, appsright)) :: sets) elist : ([]) | elistNe (elistNe) elistNe: exp ([exp]) | exp COMMA elistNe (exp :: elistNe) 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), (LBRACKleft, recd2right)) | LBRACK ctxt RBRACK recd (TAction (ctxt, recd, StringMap.empty), (LBRACKleft, recdright)) | LBRACK ctxt RBRACK (TAction (ctxt, StringMap.empty, StringMap.empty), (LBRACKleft, ctxtright)) | LPAREN typ RPAREN (typ) | ctxt DARROW typ (TNested (ctxt, typ), (ctxtleft, typright)) recd : LBRACE RBRACE (StringMap.empty) | LBRACE recdNe RBRACE (recdNe) recdNe : CSYMBOL COLON typ (StringMap.insert (StringMap.empty, CSYMBOL, typ)) | CSYMBOL COLON typ COMMA recdNe (StringMap.insert (recdNe, CSYMBOL, typ)) ctxt : ROOT (CRoot, (ROOTleft, ROOTright)) | CSYMBOL (CConst CSYMBOL, (CSYMBOLleft, CSYMBOLright)) | CARET ctxt (CPrefix ctxt, (CARETleft, ctxtright)) | BANG ctxt (CNot ctxt, (BANGleft, ctxtright)) | ctxt AND ctxt (CAnd (ctxt1, ctxt2), (ctxt1left, ctxt2right)) | LPAREN ctxt RPAREN (ctxt)