summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Compile
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-10-14 11:15:18 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-10-14 11:15:18 +0000
commitac288386c44bdfab783ae2cdc0882d411a9c6b00 (patch)
tree5ed4e7aecc60b2066188a25f6e36654f52bd2925 /src/compiler/GF/Compile
parentb5cc77aea18e5855e95ddc1fb67039d99a2e956a (diff)
the compiler now allows + to be used as a floating point addition in the abstract syntax
Diffstat (limited to 'src/compiler/GF/Compile')
-rw-r--r--src/compiler/GF/Compile/GenerateBC.hs5
-rw-r--r--src/compiler/GF/Compile/TypeCheck/TC.hs5
2 files changed, 10 insertions, 0 deletions
diff --git a/src/compiler/GF/Compile/GenerateBC.hs b/src/compiler/GF/Compile/GenerateBC.hs
index a121a3d5e..1f1e81ab9 100644
--- a/src/compiler/GF/Compile/GenerateBC.hs
+++ b/src/compiler/GF/Compile/GenerateBC.hs
@@ -131,6 +131,11 @@ compileFun gr arity st vs (Let (x, (_, e1)) e2) h0 bs args =
let (h1,bs1,arg,is1) = compileLambda gr st vs [] e1 h0 bs
(h2,bs2,is2) = compileFun gr arity st ((x,arg):vs) e2 h1 bs1 args
in (h2,bs2,is1++is2)
+compileFun gr arity st vs (Glue e1 e2) h0 bs args =
+ let (h1,bs1,arg1,is1) = compileArg gr st vs e1 h0 bs
+ (h2,bs2,arg2,is2) = compileArg gr st vs e2 h1 bs1
+ (st1,is3) = pushArgs st [arg2,arg1]
+ in (h2,bs2,is1++is2++is3++[ADD])
compileFun gr arity st vs e _ _ _ = error (show e)
compileArg gr st vs (Q(m,id)) h0 bs =
diff --git a/src/compiler/GF/Compile/TypeCheck/TC.hs b/src/compiler/GF/Compile/TypeCheck/TC.hs
index 9a3cb7103..531d862f4 100644
--- a/src/compiler/GF/Compile/TypeCheck/TC.hs
+++ b/src/compiler/GF/Compile/TypeCheck/TC.hs
@@ -46,6 +46,7 @@ data AExp =
| ARecType [ALabelling]
| AR [AAssign]
| AP AExp Label Val
+ | AGlue AExp AExp
| AData Val
deriving (Eq,Show)
@@ -162,6 +163,10 @@ checkExp th tenv@(k,rho,gamma) e ty = do
P r l -> do (r',cs) <- checkExp th tenv r (VRecType [(l,typ)])
return (AP r' l typ,cs)
+ Glue x y -> do cs1 <- eqVal k valAbsFloat typ
+ (x,cs2) <- checkExp th tenv x typ
+ (y,cs3) <- checkExp th tenv y typ
+ return (AGlue x y,cs1++cs2++cs3)
_ -> checkInferExp th tenv e typ
checkInferExp :: Theory -> TCEnv -> Exp -> Val -> Err (AExp, [(Val,Val)])