forked from GitHub/gf-core
Added | syntax for variants.
This commit is contained in:
@@ -209,6 +209,7 @@ data Exp =
|
|||||||
| EExtend Exp Exp
|
| EExtend Exp Exp
|
||||||
| EGlue Exp Exp
|
| EGlue Exp Exp
|
||||||
| EConcat Exp Exp
|
| EConcat Exp Exp
|
||||||
|
| EVariant Exp Exp
|
||||||
| EAbstr [Bind] Exp
|
| EAbstr [Bind] Exp
|
||||||
| ECTable [Bind] Exp
|
| ECTable [Bind] Exp
|
||||||
| EProd Decl Exp
|
| EProd Decl Exp
|
||||||
|
|||||||
@@ -214,10 +214,11 @@ ESelect. Exp3 ::= Exp3 "!" Exp4 ;
|
|||||||
ETupTyp. Exp3 ::= Exp3 "*" Exp4 ;
|
ETupTyp. Exp3 ::= Exp3 "*" Exp4 ;
|
||||||
EExtend. 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 ;
|
EAbstr. Exp ::= "\\" [Bind] "->" Exp ;
|
||||||
ECTable. Exp ::= "\\""\\" [Bind] "=>" Exp ;
|
ECTable. Exp ::= "\\""\\" [Bind] "=>" Exp ;
|
||||||
EProd. Exp ::= Decl "->" Exp ;
|
EProd. Exp ::= Decl "->" Exp ;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -428,13 +428,18 @@ Exp3 : Exp3 '!' Exp4 { ESelect $1 $3 }
|
|||||||
| Exp4 { $1 }
|
| Exp4 { $1 }
|
||||||
|
|
||||||
|
|
||||||
|
Exp2 :: { Exp }
|
||||||
|
Exp2 : Exp3 '+' Exp2 { EGlue $1 $3 }
|
||||||
|
| Exp3 { $1 }
|
||||||
|
|
||||||
|
|
||||||
Exp1 :: { Exp }
|
Exp1 :: { Exp }
|
||||||
Exp1 : Exp2 '+' Exp1 { EGlue $1 $3 }
|
Exp1 : Exp2 '++' Exp1 { EConcat $1 $3 }
|
||||||
| Exp2 { $1 }
|
| Exp2 { $1 }
|
||||||
|
|
||||||
|
|
||||||
Exp :: { Exp }
|
Exp :: { Exp }
|
||||||
Exp : Exp1 '++' Exp { EConcat $1 $3 }
|
Exp : Exp1 '|' Exp { EVariant $1 $3 }
|
||||||
| '\\' ListBind '->' Exp { EAbstr $2 $4 }
|
| '\\' ListBind '->' Exp { EAbstr $2 $4 }
|
||||||
| '\\' '\\' ListBind '=>' Exp { ECTable $3 $5 }
|
| '\\' '\\' ListBind '=>' Exp { ECTable $3 $5 }
|
||||||
| Decl '->' Exp { EProd $1 $3 }
|
| Decl '->' Exp { EProd $1 $3 }
|
||||||
@@ -447,10 +452,6 @@ Exp : Exp1 '++' Exp { EConcat $1 $3 }
|
|||||||
| Exp1 { $1 }
|
| Exp1 { $1 }
|
||||||
|
|
||||||
|
|
||||||
Exp2 :: { Exp }
|
|
||||||
Exp2 : Exp3 { $1 }
|
|
||||||
|
|
||||||
|
|
||||||
ListExp :: { [Exp] }
|
ListExp :: { [Exp] }
|
||||||
ListExp : {- empty -} { [] }
|
ListExp : {- empty -} { [] }
|
||||||
| Exp { (:[]) $1 }
|
| Exp { (:[]) $1 }
|
||||||
|
|||||||
@@ -378,8 +378,9 @@ instance Print Exp where
|
|||||||
ESelect exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "!") , prt 4 exp])
|
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])
|
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])
|
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])
|
EGlue exp0 exp -> prPrec i 2 (concatD [prt 3 exp0 , doc (showString "+") , prt 2 exp])
|
||||||
EConcat exp0 exp -> prPrec i 0 (concatD [prt 1 exp0 , doc (showString "++") , prt 0 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])
|
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])
|
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])
|
EProd decl exp -> prPrec i 0 (concatD [prt 0 decl , doc (showString "->") , prt 0 exp])
|
||||||
|
|||||||
@@ -501,6 +501,11 @@ transExp x = case x of
|
|||||||
ECTable binds exp -> liftM2 M.mkCTable (mapM transBind binds) (transExp exp)
|
ECTable binds exp -> liftM2 M.mkCTable (mapM transBind binds) (transExp exp)
|
||||||
|
|
||||||
EVariants exps -> liftM G.FV $ mapM transExp exps
|
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)
|
EPre exp alts -> liftM2 (curry G.Alts) (transExp exp) (mapM transAltern alts)
|
||||||
EStrs exps -> liftM G.Strs $ mapM transExp exps
|
EStrs exps -> liftM G.Strs $ mapM transExp exps
|
||||||
ESelect exp0 exp -> liftM2 G.S (transExp exp0) (transExp exp)
|
ESelect exp0 exp -> liftM2 G.S (transExp exp0) (transExp exp)
|
||||||
|
|||||||
Reference in New Issue
Block a user