Added | syntax for variants.

This commit is contained in:
bjorn
2008-10-03 07:35:26 +00:00
parent 6d4d6bce68
commit 4b41039a5d
6 changed files with 279 additions and 259 deletions

View File

@@ -209,6 +209,7 @@ data Exp =
| EExtend Exp Exp
| EGlue Exp Exp
| EConcat Exp Exp
| EVariant Exp Exp
| EAbstr [Bind] Exp
| ECTable [Bind] Exp
| EProd Decl Exp

View File

@@ -214,10 +214,11 @@ ESelect. Exp3 ::= Exp3 "!" Exp4 ;
ETupTyp. Exp3 ::= Exp3 "*" Exp4 ;
EExtend. Exp3 ::= Exp3 "**" Exp4 ;
EGlue. Exp1 ::= Exp2 "+" Exp1 ;
EGlue. Exp2 ::= Exp3 "+" Exp2 ;
EConcat. Exp ::= Exp1 "++" Exp ;
EConcat. Exp1 ::= Exp2 "++" Exp1 ;
EVariant. Exp ::= Exp1 "|" Exp ;
EAbstr. Exp ::= "\\" [Bind] "->" Exp ;
ECTable. Exp ::= "\\""\\" [Bind] "=>" Exp ;
EProd. Exp ::= Decl "->" Exp ;

File diff suppressed because one or more lines are too long

View File

@@ -428,13 +428,18 @@ Exp3 : Exp3 '!' Exp4 { ESelect $1 $3 }
| Exp4 { $1 }
Exp2 :: { Exp }
Exp2 : Exp3 '+' Exp2 { EGlue $1 $3 }
| Exp3 { $1 }
Exp1 :: { Exp }
Exp1 : Exp2 '+' Exp1 { EGlue $1 $3 }
Exp1 : Exp2 '++' Exp1 { EConcat $1 $3 }
| Exp2 { $1 }
Exp :: { Exp }
Exp : Exp1 '++' Exp { EConcat $1 $3 }
Exp : Exp1 '|' Exp { EVariant $1 $3 }
| '\\' ListBind '->' Exp { EAbstr $2 $4 }
| '\\' '\\' ListBind '=>' Exp { ECTable $3 $5 }
| Decl '->' Exp { EProd $1 $3 }
@@ -447,10 +452,6 @@ Exp : Exp1 '++' Exp { EConcat $1 $3 }
| Exp1 { $1 }
Exp2 :: { Exp }
Exp2 : Exp3 { $1 }
ListExp :: { [Exp] }
ListExp : {- empty -} { [] }
| Exp { (:[]) $1 }

View File

@@ -378,8 +378,9 @@ instance Print Exp where
ESelect exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "!") , prt 4 exp])
ETupTyp exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "*") , prt 4 exp])
EExtend exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "**") , prt 4 exp])
EGlue exp0 exp -> prPrec i 1 (concatD [prt 2 exp0 , doc (showString "+") , prt 1 exp])
EConcat exp0 exp -> prPrec i 0 (concatD [prt 1 exp0 , doc (showString "++") , prt 0 exp])
EGlue exp0 exp -> prPrec i 2 (concatD [prt 3 exp0 , doc (showString "+") , prt 2 exp])
EConcat exp0 exp -> prPrec i 1 (concatD [prt 2 exp0 , doc (showString "++") , prt 1 exp])
EVariant exp0 exp -> prPrec i 0 (concatD [prt 1 exp0 , doc (showString "|") , prt 0 exp])
EAbstr binds exp -> prPrec i 0 (concatD [doc (showString "\\") , prt 0 binds , doc (showString "->") , prt 0 exp])
ECTable binds exp -> prPrec i 0 (concatD [doc (showString "\\") , doc (showString "\\") , prt 0 binds , doc (showString "=>") , prt 0 exp])
EProd decl exp -> prPrec i 0 (concatD [prt 0 decl , doc (showString "->") , prt 0 exp])

View File

@@ -501,6 +501,11 @@ transExp x = case x of
ECTable binds exp -> liftM2 M.mkCTable (mapM transBind binds) (transExp exp)
EVariants exps -> liftM G.FV $ mapM transExp exps
EVariant exp0 exp -> do let fvList (G.FV xs) = xs
fvList t = [t]
exp0' <- transExp exp0
exp' <- transExp exp
return $ G.FV $ fvList exp0' ++ fvList exp'
EPre exp alts -> liftM2 (curry G.Alts) (transExp exp) (mapM transAltern alts)
EStrs exps -> liftM G.Strs $ mapM transExp exps
ESelect exp0 exp -> liftM2 G.S (transExp exp0) (transExp exp)