File tree Expand file tree Collapse file tree 3 files changed +72
-0
lines changed Expand file tree Collapse file tree 3 files changed +72
-0
lines changed Original file line number Diff line number Diff line change
1
+ module Gen where
2
+
3
+ import Infer
4
+ import Syntax
5
+ import Type
6
+
7
+
8
+ generateType :: GlslTypes -> String
9
+ generateType ty = case ty of
10
+ Bool -> " bool"
11
+ Int -> " int"
12
+ Float -> " float"
13
+ Vec2 -> " vec2"
14
+ Vec3 -> " vec3"
15
+
16
+
17
+ generateLet :: TypeEnv -> [Decl ] -> Expr -> String -> String
18
+ generateLet env [] inExpr state = state ++ " return " ++ (generateExpr env inExpr) ++ " ;\n "
19
+ generateLet env ((var, expr): xs) inExpr state = let
20
+ typeResult = inferExpr env expr
21
+ (newEnv, newState) = case typeResult of
22
+ Left error -> (env, state ++ (show error ))
23
+ Right scheme@ (Forall [] (TCon ty)) -> (extend env (var, scheme), state ++ (generateType ty) ++ " " ++ var ++ " = " ++ (generateExpr env expr) ++ " ;\n " )
24
+ in generateLet newEnv xs inExpr newState
25
+
26
+ generateExpr :: TypeEnv -> Expr -> String
27
+ generateExpr env expr = case expr of
28
+ Var x -> x
29
+
30
+ Let decls expr -> generateLet env decls expr " "
31
+
32
+ Lit lit -> case lit of
33
+ LInt int -> show int
34
+
35
+ LBool bool -> show bool
36
+
37
+ LFloat float -> show float
Original file line number Diff line number Diff line change
1
+ # This file was autogenerated by Stack.
2
+ # You should not edit this file by hand.
3
+ # For more information, please see the documentation at:
4
+ # https://docs.haskellstack.org/en/stable/lock_files
5
+
6
+ packages:
7
+ - completed:
8
+ hackage: megaparsec-7.0.4@sha256:890d317e75151a48567900cdbe39d3c44e83918d79a39ce97b9245cab5402d5e,6222
9
+ pantry-tree:
10
+ size: 2647
11
+ sha256: 550e6fd35a8fde17f7fa005e823ee7a23b5415e73c8d5058825832d256ab5609
12
+ original:
13
+ hackage: megaparsec-7.0.4
14
+ - completed:
15
+ hackage: primitive-0.6.4.0@sha256:5b6a2c3cc70a35aabd4565fcb9bb1dd78fe2814a36e62428a9a1aae8c32441a1,2079
16
+ pantry-tree:
17
+ size: 1517
18
+ sha256: 5d5e591311664886e88ade3da6880c32adf0d1fe80c55f40a3c93bb91df8fdeb
19
+ original:
20
+ hackage: primitive-0.6.4.0
21
+ snapshots:
22
+ - completed:
23
+ size: 506735
24
+ url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/12/19.yaml
25
+ sha256: 78de20c2fce471a4c4a19e935e216538e7f0308f6f15ad72aedc5484de45f09b
26
+ original: lts-12.19
Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ import Syntax
8
8
import Lexer
9
9
import Infer
10
10
import Type
11
+ import Gen
11
12
12
13
13
14
@@ -94,3 +95,11 @@ main = hspec $ do
94
95
case P. parseModule " std.yin" stdLib of
95
96
Right a -> True `shouldBe` True
96
97
Left err -> do { putStrLn $ show err; False `shouldBe` True }
98
+
99
+ describe " code generation" $ do
100
+
101
+ it " should generate simple let expr" $ do
102
+ let expr = (Let [ (" a" , Lit $ LInt 1 )
103
+ , (" b" , Var " a" )] (Var " b" ))
104
+ let result = generateExpr glslStdLib expr
105
+ result `shouldBe` " int a = 1;\n int b = a;\n return b;\n "
You can’t perform that action at this time.
0 commit comments