Skip to content

Commit 81c7151

Browse files
committed
Either Hot Shit or Total Bollocks
1 parent 41cf446 commit 81c7151

File tree

3 files changed

+104
-107
lines changed

3 files changed

+104
-107
lines changed

README.org

Lines changed: 53 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ since this is a bit tidies i allowed users to use expressions in the context
104104

105105
(refer to the grammar defined above)
106106

107-
shortened (not completely while-language correct ...) version
107+
shortened (not commpletely while-language correct ...) version
108108

109109
#+begin_src
110110
x0 := 0;
@@ -115,86 +115,41 @@ loop x2 do x0 := x0 + x1 end
115115
#+end_src
116116

117117

118-
#+begin_src shell
119-
felix in ~/git-repos/hub/while on dev ● λ stack build
120-
felix in ~/git-repos/hub/while on dev ● λ stack run
121-
122-
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
123-
124-
Enter the file name:
125-
./examples/multiplication-func.while
126-
[READING .WHILE FILE] "./examples/multiplication-func.while"
127-
128-
[DONE TOKENIZE]:
129-
[MetaToken {getLineNumber = 1, getToken = VarToken {getVarName = "rv"}},
130-
MetaToken {getLineNumber = 1, getToken = AssignToken},
131-
MetaToken {getLineNumber = 1, getToken = ConstToken {getConstInt = 0}},
132-
MetaToken {getLineNumber = 1, getToken = SemicolonToken},
133-
MetaToken {getLineNumber = 2, getToken = VarToken {getVarName = "a"}},
134-
MetaToken {getLineNumber = 2, getToken = AssignToken},
135-
MetaToken {getLineNumber = 2, getToken = ConstToken {getConstInt = 420}},
136-
MetaToken {getLineNumber = 2, getToken = SemicolonToken},
137-
MetaToken {getLineNumber = 3, getToken = VarToken {getVarName = "b"}},
138-
MetaToken {getLineNumber = 3, getToken = AssignToken},
139-
MetaToken {getLineNumber = 3, getToken = ConstToken {getConstInt = 69}},
140-
MetaToken {getLineNumber = 3, getToken = SemicolonToken},
141-
MetaToken {getLineNumber = 5, getToken = WhileToken},
142-
MetaToken {getLineNumber = 5, getToken = VarToken {getVarName = "b"}},
143-
MetaToken {getLineNumber = 5, getToken = NotEqualToken},
144-
MetaToken {getLineNumber = 5, getToken = ConstToken {getConstInt = 0}},
145-
MetaToken {getLineNumber = 5, getToken = DoToken},
146-
MetaToken {getLineNumber = 6, getToken = VarToken {getVarName = "temp"}},
147-
MetaToken {getLineNumber = 6, getToken = AssignToken},
148-
MetaToken {getLineNumber = 6, getToken = VarToken {getVarName = "rv"}},
149-
MetaToken {getLineNumber = 6, getToken = SemicolonToken},
150-
MetaToken {getLineNumber = 7, getToken = LoopToken},
151-
MetaToken {getLineNumber = 7, getToken = VarToken {getVarName = "a"}},
152-
MetaToken {getLineNumber = 7, getToken = DoToken},
153-
MetaToken {getLineNumber = 7, getToken = VarToken {getVarName = "temp"}},
154-
MetaToken {getLineNumber = 7, getToken = AssignToken},
155-
MetaToken {getLineNumber = 7, getToken = VarToken {getVarName = "temp"}},
156-
MetaToken {getLineNumber = 7, getToken = PlusToken},
157-
MetaToken {getLineNumber = 7, getToken = ConstToken {getConstInt = 1}},
158-
MetaToken {getLineNumber = 7, getToken = EndToken},
159-
MetaToken {getLineNumber = 7, getToken = SemicolonToken},
160-
MetaToken {getLineNumber = 8, getToken = VarToken {getVarName = "rv"}},
161-
MetaToken {getLineNumber = 8, getToken = AssignToken},
162-
MetaToken {getLineNumber = 8, getToken = VarToken {getVarName = "temp"}},
163-
MetaToken {getLineNumber = 8, getToken = SemicolonToken},
164-
MetaToken {getLineNumber = 10, getToken = VarToken {getVarName = "b"}},
165-
MetaToken {getLineNumber = 10, getToken = AssignToken},
166-
MetaToken {getLineNumber = 10, getToken = VarToken {getVarName = "b"}},
167-
MetaToken {getLineNumber = 10, getToken = MinusToken},
168-
MetaToken {getLineNumber = 10, getToken = ConstToken {getConstInt = 1}},
169-
MetaToken {getLineNumber = 11, getToken = EndToken}]
170-
171-
[DONE PARSING AST]:
172-
Sequential
173-
(Assignment "rv" (Constant {getConst = 0}))
174-
(Sequential
175-
(Assignment "a" (Constant {getConst = 420}))
176-
(Sequential
177-
(Assignment "b" (Constant {getConst = 69}))
178-
(While
179-
(Neq (Variable {getVar = "b"}) (Constant {getConst = 0}))
180-
(Sequential
181-
(Assignment "temp" (Variable {getVar = "rv"}))
182-
(Sequential
183-
(Loop
184-
(Variable {getVar = "a"})
185-
(Assignment "temp" (Add (Variable {getVar = "temp"}) (Constant {getConst = 1}))))
186-
(Sequential
187-
(Assignment "rv" (Variable {getVar = "temp"}))
188-
(Assignment "b" (Subtract (Variable {getVar = "b"}) (Constant {getConst = 1})))))))))
189-
190-
[OUTPUT OF EVALUATION]:
191-
[("temp",28980),("b",0),("a",420),("rv",28980)]
118+
*** how to call `stack run`
192119

193-
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
120+
#+begin_src shell :exports both :results output
121+
stack run
122+
#+end_src
194123

195-
felix in ~/git-repos/hub/while on dev ● λ
124+
#+RESULTS:
125+
:
126+
: = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
127+
: [Error]: Usage: stack run <filename>
128+
: Use 'stack run <filename>' to interpret a while source file.
129+
: = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
130+
:
131+
132+
#+begin_src shell :exports both :results output
133+
stack run ./examples/multiplication-func.while
196134
#+end_src
197135

136+
#+RESULTS:
137+
#+begin_example
138+
139+
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
140+
141+
[Interpreting file] ./examples/multiplication-func.while
142+
[READING .WHILE FILE] "./examples/multiplication-func.while"
143+
[DONE TOKENIZE]
144+
[DONE PARSING AST]
145+
[RESULT OF EVALUATION]
146+
[("temp",28980),("b",0),("a",420),("rv",28980)]
147+
148+
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
149+
150+
#+end_example
151+
152+
198153
*** compile
199154

200155
#+begin_src shell
@@ -225,40 +180,46 @@ stack exec hlint src/*.hs app/*.hs test/*.hs
225180

226181
** requirements
227182

228-
*** [[https://docs.haskellstack.org/en/stable/][Haskell Tool Stack]]
183+
*** using `apt`
184+
185+
**** [[https://docs.haskellstack.org/en/stable/][Haskell Tool Stack]]
229186

230187
#+begin_src shell
231188
curl -SL https://get.haskellstack.org/ | sh
232189
#+end_src
233190

234-
#+begin_example
235-
Pro tip: you should look at the file before you run it
236-
#+end_example
237191

238-
239-
*** [[https://www.haskell.org/ghc/][Glasgow Haskell Compiler]]
192+
**** [[https://www.haskell.org/ghc/][Glasgow Haskell Compiler]]
240193

241194
#+begin_src shell
242195
apt install ghc
243196
#+end_src
244197

245-
#+begin_example
246-
Pro tip: GHC has a interactive shell called `ghci`
198+
**** [[https://github.com/ndmitchell/hlint#readme][HLint]]
247199

248-
- `:e` for edit
249-
- `:l filename` for loading files
250-
- `:r` for reloading
251-
- etc.
252-
#+end_example
200+
#+begin_src shell
201+
apt install hlint
202+
#+end_src
253203

254204

255-
*** [[https://github.com/ndmitchell/hlint#readme][HLint]]
205+
*** using `nix`
256206

257207
#+begin_src shell
258-
apt install hlint
208+
nix-shell
209+
#+end_src
210+
211+
**** hlint
212+
213+
#+begin_src shell
214+
hlint src/*.hs app/*.hs test/*.hs
259215
#+end_src
260216

261217

218+
**** build and run
219+
220+
same as before
221+
222+
262223
** LICENSE (BSD-3-Clause)
263224

264225
#+begin_src shell :exports both :results output

app/Main.hs

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,52 @@
33

44
module Main (main) where
55

6+
import System.Environment (getArgs)
7+
68
import WhileParser (tokenize, readFileContent, runASTParser) -- WhileAST(..),
79
import WhileEvaluation (eval) --, evalM, VarName, VarVal, VarState, VarStateWorld)
810

911

10-
main :: IO ()
11-
main = do
12-
putStrLn $ "\n" ++ concat (replicate 40 " =") ++ "\n"
12+
-- | Define a data type to represent the command-line options
13+
newtype Options = Options { getFileName :: FilePath }
14+
15+
16+
-- | Parse command-line arguments manually
17+
parseArgs :: [String] -> Either String Options
18+
parseArgs [file] = Right $ Options file
19+
parseArgs _ = Left "Usage: stack run <filename>"
1320

14-
-- Prompt the user for the file name
15-
putStrLn "Enter the file name:"
16-
fileName <- getLine
21+
-- | Run interpreter logic with the parsed options
22+
runInterpreter :: Options -> IO ()
23+
runInterpreter options = do
24+
putStrLn $ "\n" ++ concat (replicate 40 "= ") ++ "=\n"
25+
26+
putStrLn $ "\ESC[92m[Interpreting file]\ESC[0m " ++ getFileName options
1727

1828
-- Read the content of the specified file
19-
whileLines <- readFileContent fileName -- "./examples/simple.while"
29+
whileLines <- readFileContent $ getFileName options
2030
let tokens = tokenize whileLines
2131

22-
putStrLn "\n\ESC[92m[DONE TOKENIZE]\ESC[0m:"
23-
print tokens
32+
putStrLn "\ESC[92m[DONE TOKENIZE]\ESC[0m"
33+
-- print tokens
2434

25-
let astOfFoo = runASTParser tokens
26-
putStrLn "\n\ESC[92m[DONE PARSING AST]\ESC[0m:"
27-
print astOfFoo
35+
let ast = runASTParser tokens
36+
putStrLn "\ESC[92m[DONE PARSING AST]\ESC[0m"
37+
-- print ast
2838

29-
putStrLn "\n\ESC[92m[OUTPUT OF EVALUATION]\ESC[0m:"
30-
let a = eval astOfFoo []
39+
putStrLn "\ESC[92m[RESULT OF EVALUATION]\ESC[0m"
40+
let a = eval ast []
3141
print a
3242

33-
putStrLn $ "\n" ++ concat (replicate 40 " =") ++ "\n"
43+
putStrLn $ "\n" ++ concat (replicate 40 "= ") ++ "=\n"
44+
45+
46+
main :: IO ()
47+
main = do
48+
args <- getArgs
49+
case parseArgs args of
50+
Left err -> putStrLn $ vbar ++ "\ESC[91m[Error]\ESC[0m: " ++ err ++
51+
"\nUse 'stack run <filename>' to interpret a while source file." ++ vbar
52+
Right options -> runInterpreter options
53+
where
54+
vbar = "\n" ++ concat (replicate 40 "= ") ++ "=\n"

shell.nix

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{ pkgs ? import <nixpkgs> {} }:
2+
3+
pkgs.mkShell {
4+
name="dev-environment";
5+
6+
buildInputs = with pkgs; [
7+
stack
8+
ghc
9+
hlint
10+
];
11+
12+
shellHook = ''
13+
echo "Start developing..."
14+
'';
15+
}

0 commit comments

Comments
 (0)