@@ -27,40 +27,53 @@ The compiler processes source code through the following stages:
2727Programs are represented internally using a series of increasingly lower-level data structures:
2828
29291. **Abstract Syntax Tree (AST)**:
30- ```haskell
31- data Program = Program FunctionDef
32- data FunctionDef = Function
33- { name :: Text
34- , body :: Statement
35- }
36- data Statement = Return Expr
37- data Expr = Constant Int | Unary UnaryOp Expr
38- data UnaryOp = Complement | Negate
39- ```
30+ ```haskell
31+ data Program = Program Function
32+ data Function = Function
33+ { name :: Text
34+ , body :: Statement
35+ }
36+ data Statement = Return Expr
37+ data Expr
38+ = Constant { value :: Int }
39+ | Unary { operator :: UnaryOp, operand :: Expr }
40+ data UnaryOp = Complement | Negate
41+ ```
4042
41432 . ** TACKY IR** :
4244 ``` haskell
43- data Program = Program FunctionDef
44- data FunctionDef = Function
45+ data Program = Program Function
46+ data Function = Function
4547 { name :: Text
4648 , body :: [Instruction ]
4749 }
48- data Instruction
49- = Return TackyVal
50- | Unary UnaryOp TackyVal TackyVal
51- data TackyVal = Constant Int | Var Text
50+ data Instruction
51+ = Return { value :: Val }
52+ | Unary { operator :: UnaryOp , src :: Val , dst :: Val }
53+ data Val = Constant Int | Var Text
54+ data UnaryOp = Complement | Negate
5255 ```
5356
54573 . ** Assembly AST **:
55- ```haskell
56- data Program = Program FunctionDef
57- data FunctionDef = Function
58- { name :: Text
59- , instructions :: [Instruction ]
60- }
61- data Instruction = Mov Operand Operand | Ret
62- data Operand = Imm Int | Register
63- ```
58+ ```haskell
59+ data Program = Program Function
60+ data Function = Function
61+ { name :: Text
62+ , instructions :: [Instruction ]
63+ }
64+ data Instruction
65+ = Mov { src :: Operand , dst :: Operand }
66+ | Unary { operator :: UnaryOp , operand :: Operand }
67+ | AllocateStack { bytes :: Int }
68+ | Ret
69+ data Operand
70+ = Imm Int
71+ | Register Reg
72+ | Pseudo Text
73+ | Stack Int
74+ data UnaryOp = Neg | Not
75+ data Reg = Ax | R10
76+ ```
6477
6578
6679## Project Structure
0 commit comments