Skip to content

Commit 2e2f4e9

Browse files
committed
add let code gen
1 parent 7e38274 commit 2e2f4e9

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

src/Gen.hs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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

stack.yaml.lock

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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

test/Spec.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Syntax
88
import Lexer
99
import Infer
1010
import Type
11+
import Gen
1112

1213

1314

@@ -94,3 +95,11 @@ main = hspec $ do
9495
case P.parseModule "std.yin" stdLib of
9596
Right a -> True `shouldBe` True
9697
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;\nint b = a;\nreturn b;\n"

0 commit comments

Comments
 (0)