Compare commits
3 Commits
a9549210a7
...
b89be8de8c
Author | SHA1 | Date |
---|---|---|
Ethan Reece | b89be8de8c | |
Ethan Reece | 08e684206e | |
Ethan Reece | 0b915f5788 |
10
README.md
10
README.md
|
@ -1,15 +1,19 @@
|
||||||
# Really Bad Compiler in Haskell
|
# Really Bad Compiler in Haskell
|
||||||
|
|
||||||
A compiler written in Haskell which can currently perform basic arithmetic. Currently using the megaparsec and llvm-hs-\* libraries, but I plan to reimplement parsing and llvm generation myself. Built for the Introduction to Compiler Design class at The University of Texas at Dallas.
|
A compiler written in Haskell which can currently perform basic arithmetic. Currently using the megaparsec and llvm-hs-\* libraries, but I may reimplement certain libraries myself. Built for the Introduction to Compiler Design class at The University of Texas at Dallas.
|
||||||
|
|
||||||
Main repo: https://git.sudoer.ch/me/really-bad-compiler-in-haskell
|
Main repo: https://git.sudoer.ch/me/really-bad-compiler-in-haskell
|
||||||
|
|
||||||
## Build Instructions
|
## Setup Instructions
|
||||||
|
|
||||||
- Install `ghcup` (for managing Haskell tools) and `nix` (for managing external dependencies).
|
- Install `ghcup` (for managing Haskell tools) and `nix` (for managing external dependencies).
|
||||||
- Clone the repo.
|
- Clone the repo.
|
||||||
- Use `ghcup` to install `stack 2.9.3`, `HLS 2.2.0.0`, `GHC 9.2.8`, and `cabal 3.6.2.0`.
|
- Use `ghcup` to install `stack 2.9.3`, `HLS 2.2.0.0`, `GHC 9.2.8`, and `cabal 3.6.2.0`.
|
||||||
|
|
||||||
|
## Run Instructions
|
||||||
|
|
||||||
- Use `stack run <file>` to run the program (for example, `stack run example/1`).
|
- Use `stack run <file>` to run the program (for example, `stack run example/1`).
|
||||||
|
- The LLVM will be generated as `a.out.ll`, and the executable will be generated as `a.out`.
|
||||||
|
|
||||||
## To edit
|
## To edit
|
||||||
|
|
||||||
|
@ -45,7 +49,7 @@ I recommend using VSCodium, which is preconfigured to have syntax highlighting a
|
||||||
|
|
||||||
- Language: Haskell
|
- Language: Haskell
|
||||||
- Haskell tools: GHCup, Stack, Cabal, GHC 9.2
|
- Haskell tools: GHCup, Stack, Cabal, GHC 9.2
|
||||||
- Libraries: megaparsec, parser-combinators, text, process, llvm-hs-pure 15, llvm-hs-pretty-15
|
- Libraries: megaparsec, parser-combinators, text, process, llvm-hs 15, llvm-hs-pure 15,
|
||||||
- Dependencies: llvm 15, clang 15
|
- Dependencies: llvm 15, clang 15
|
||||||
- IDE: VSCodium
|
- IDE: VSCodium
|
||||||
- Git platform: Forgejo
|
- Git platform: Forgejo
|
||||||
|
|
|
@ -27,9 +27,7 @@ getLLVM expr =
|
||||||
printf <- externVarArgs "printf" [ptr] i32
|
printf <- externVarArgs "printf" [ptr] i32
|
||||||
function "main" [] i32 $ \_ -> mdo
|
function "main" [] i32 $ \_ -> mdo
|
||||||
numFormatStr <- globalStringPtr "%d\n" (mkName "str")
|
numFormatStr <- globalStringPtr "%d\n" (mkName "str")
|
||||||
traceShow numFormatStr $ pure ()
|
|
||||||
ourExpression <- exprToLLVM expr
|
ourExpression <- exprToLLVM expr
|
||||||
-- _ <- call (FunctionType i32 [i32])
|
|
||||||
_ <- call (FunctionType i32 [ptr] True) printf [(ConstantOperand numFormatStr, []), (ourExpression, [])]
|
_ <- call (FunctionType i32 [ptr] True) printf [(ConstantOperand numFormatStr, []), (ourExpression, [])]
|
||||||
ret (int32 0)
|
ret (int32 0)
|
||||||
|
|
||||||
|
@ -52,6 +50,10 @@ exprToLLVM (Expr.Mul a b) = mdo
|
||||||
lhs <- exprToLLVM a
|
lhs <- exprToLLVM a
|
||||||
rhs <- exprToLLVM b
|
rhs <- exprToLLVM b
|
||||||
mul lhs rhs
|
mul lhs rhs
|
||||||
|
exprToLLVM (Expr.Div a b) = mdo
|
||||||
|
lhs <- exprToLLVM a
|
||||||
|
rhs <- exprToLLVM b
|
||||||
|
sdiv lhs rhs
|
||||||
|
|
||||||
primToLLVM :: Int -> Operand
|
primToLLVM :: Int -> Operand
|
||||||
primToLLVM i = int32 (fromIntegral i)
|
primToLLVM i = int32 (fromIntegral i)
|
||||||
|
|
|
@ -27,8 +27,8 @@ term = Lit <$> intParser
|
||||||
|
|
||||||
table :: [[Operator Parser Expr]]
|
table :: [[Operator Parser Expr]]
|
||||||
table =
|
table =
|
||||||
[ [ binaryOp "*" Mul
|
[ [ binaryOp "*" Mul,
|
||||||
-- binaryOp "/" Div
|
binaryOp "/" Div
|
||||||
],
|
],
|
||||||
[ binaryOp "+" Add,
|
[ binaryOp "+" Add,
|
||||||
binaryOp "-" Sub
|
binaryOp "-" Sub
|
||||||
|
|
|
@ -5,7 +5,7 @@ data Expr
|
||||||
| Add Expr Expr
|
| Add Expr Expr
|
||||||
| Sub Expr Expr
|
| Sub Expr Expr
|
||||||
| Mul Expr Expr
|
| Mul Expr Expr
|
||||||
|
| Div Expr Expr
|
||||||
deriving
|
deriving
|
||||||
( -- | Div Expr Expr
|
( Show
|
||||||
Show
|
|
||||||
)
|
)
|
|
@ -9,7 +9,6 @@ dependencies:
|
||||||
- process
|
- process
|
||||||
- llvm-hs >= 15 && < 16
|
- llvm-hs >= 15 && < 16
|
||||||
- llvm-hs-pure >= 15 && < 16
|
- llvm-hs-pure >= 15 && < 16
|
||||||
# - llvm-hs-pretty >= 15 && < 16
|
|
||||||
- bytestring
|
- bytestring
|
||||||
tested-with: GHC == 9.2.8
|
tested-with: GHC == 9.2.8
|
||||||
category: Compilers/Interpreters
|
category: Compilers/Interpreters
|
||||||
|
|
|
@ -3,8 +3,6 @@ resolver: lts-20.26
|
||||||
packages:
|
packages:
|
||||||
- .
|
- .
|
||||||
extra-deps:
|
extra-deps:
|
||||||
- github: hyunsooda/llvm-hs-pretty-15
|
|
||||||
commit: 79283942d1667168ecd65237667aff7fed730303
|
|
||||||
- github: llvm-hs/llvm-hs
|
- github: llvm-hs/llvm-hs
|
||||||
commit: 5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76
|
commit: 5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76
|
||||||
subdirs:
|
subdirs:
|
||||||
|
|
|
@ -4,17 +4,6 @@
|
||||||
# https://docs.haskellstack.org/en/stable/lock_files
|
# https://docs.haskellstack.org/en/stable/lock_files
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- completed:
|
|
||||||
name: llvm-hs-pretty
|
|
||||||
pantry-tree:
|
|
||||||
sha256: 22ac4a47e1833dece52af7a6f8589958021d67292f6cc3de015ecb7c699db62d
|
|
||||||
size: 5197
|
|
||||||
sha256: 8348b72a61807414ad15e0b7e82a7753e4473701e7ab98520c2e9d9a51c5ed7f
|
|
||||||
size: 43787
|
|
||||||
url: https://github.com/hyunsooda/llvm-hs-pretty-15/archive/79283942d1667168ecd65237667aff7fed730303.tar.gz
|
|
||||||
version: 15.0.0
|
|
||||||
original:
|
|
||||||
url: https://github.com/hyunsooda/llvm-hs-pretty-15/archive/79283942d1667168ecd65237667aff7fed730303.tar.gz
|
|
||||||
- completed:
|
- completed:
|
||||||
name: llvm-hs-pure
|
name: llvm-hs-pure
|
||||||
pantry-tree:
|
pantry-tree:
|
||||||
|
|
Reference in New Issue