···11import argv
22import ast_printer
33-import expr
43import gleam/io
54import gleam/option.{None, Some}
65import gleam/string
76import input
87import interpreter
88+import parser
99import scan
1010import simplifile
1111···3939 let assert Ok(tokens) = scan.get_tokens(lox)
4040 io.println("Tokens: " <> string.inspect(tokens))
41414242- let e = expr.parse(tokens)
4242+ let e = parser.parse(tokens)
4343 io.println("Exprs: " <> string.inspect(e))
44444545 let #(repr, val) = case e {
4646 Ok(#(e, _)) -> {
4747 let repr = ast_printer.print(e)
4848- let val = interpreter.evaluate(e)
4848+ let val = interpreter.eval(e)
4949 #(repr, Some(val))
5050 }
5151 Error(e) -> #("Error on parsing." <> e.msg, None)
5252 }
5353- io.println("repr: " <> repr)
5353+ io.println("repr:\n" <> repr)
5454+5455 case val {
5556 Some(Ok(val)) -> {
5657 io.println("val: " <> string.inspect(val))
+48-19
src/interpreter.gleam
···11import expr.{type Expr}
22+import gleam/bool
23import gleam/float
34import gleam/int
55+import gleam/io
66+import gleam/list
47import gleam/result
58import scan.{type Token}
99+import stmt.{type Stmt}
610711pub type Value {
812 StringVal(String)
···1923 err.msg <> "\n[line " <> int.to_string(err.tok.line) <> "]"
2024}
21252222-pub type EvalResult =
2626+pub fn value_str(val: Value) {
2727+ case val {
2828+ StringVal(s) -> s
2929+ NumberVal(n) -> float.to_string(n)
3030+ BoolVal(b) -> bool.to_string(b)
3131+ NilVal -> "nil"
3232+ }
3333+}
3434+3535+pub type ValueResult =
2336 Result(Value, RuntimeError)
24372525-pub fn evaluate(e: Expr) -> EvalResult {
3838+pub fn eval(e: List(Stmt)) -> Result(Nil, RuntimeError) {
3939+ list.try_map(e, fn(stmt) { eval_stmt(stmt) })
4040+ |> result.map(fn(_) { Nil })
4141+}
4242+4343+fn eval_stmt(s: Stmt) -> Result(Nil, RuntimeError) {
4444+ case s {
4545+ stmt.PrintStmt(_, e) -> {
4646+ use v <- result.try(eval_expr(e))
4747+ io.println(value_str(v))
4848+ Ok(Nil)
4949+ }
5050+ stmt.ExprStmt(e) -> result.map(eval_expr(e), fn(_) { Nil })
5151+ }
5252+}
5353+5454+fn eval_expr(e: Expr) -> ValueResult {
2655 case e {
2727- expr.ExprLit(l) -> Ok(evaluate_literal(l))
2828- expr.ExprBinary(l, op, r) -> evaluate_binary(l, op, r)
2929- expr.ExprUnary(op, e) -> evaluate_unary(op, e)
3030- expr.ExprGrouping(e) -> evaluate_grouping(e)
5656+ expr.ExprLit(l) -> Ok(eval_literal(l))
5757+ expr.ExprBinary(l, op, r) -> eval_binary(l, op, r)
5858+ expr.ExprUnary(op, e) -> eval_unary(op, e)
5959+ expr.ExprGrouping(e) -> eval_grouping(e)
3160 }
3261}
33623434-fn evaluate_grouping(e: Expr) -> EvalResult {
3535- evaluate(e)
6363+fn eval_grouping(e: Expr) -> ValueResult {
6464+ eval_expr(e)
3665}
37663838-fn evaluate_unary(op: Token, e: Expr) -> EvalResult {
3939- use v <- result.try(evaluate(e))
6767+fn eval_unary(op: Token, e: Expr) -> ValueResult {
6868+ use v <- result.try(eval_expr(e))
40694170 case op.token_type {
4271 scan.Bang -> {
···5685 }
5786}
58875959-fn evaluate_binary(l: Expr, op: expr.BinOp, r: Expr) -> EvalResult {
6060- use lv <- result.try(evaluate(l))
6161- use rv <- result.try(evaluate(r))
8888+fn eval_binary(l: Expr, op: expr.BinOp, r: Expr) -> ValueResult {
8989+ use lv <- result.try(eval_expr(l))
9090+ use rv <- result.try(eval_expr(r))
62916392 // I feel like this should be on a more restricted type than all tokens
6493 case op {
···6897 #(StringVal(lsv), StringVal(rsv)) -> Ok(StringVal(lsv <> rsv))
6998 _ ->
7099 Error(RuntimeError(
7171- op,
100100+ tok,
72101 "Operand "
7373- <> op.lexeme
102102+ <> tok.lexeme
74103 <> " requires both values to be both strings or both numbers.",
75104 ))
76105 }
···104133 lv: Value,
105134 rv: Value,
106135 f: fn(Float, Float) -> Bool,
107107-) -> EvalResult {
136136+) -> ValueResult {
108137 case #(lv, rv) {
109138 #(NumberVal(lv), NumberVal(rv)) -> Ok(BoolVal(f(lv, rv)))
110139 _ ->
···120149 lv: Value,
121150 rv: Value,
122151 f: fn(Float, Float) -> Result(Float, RuntimeError),
123123-) -> EvalResult {
152152+) -> ValueResult {
124153 case #(lv, rv) {
125154 #(NumberVal(lnv), NumberVal(rnv)) -> {
126155 use v <- result.try(f(lnv, rnv))
···130159 }
131160}
132161133133-fn binary_op_error(op: Token) -> EvalResult {
162162+fn binary_op_error(op: Token) -> ValueResult {
134163 Error(RuntimeError(
135164 op,
136165 "Operand " <> op.lexeme <> " requires both values to be numbers.",
137166 ))
138167}
139168140140-fn evaluate_literal(l: expr.ExprLit) -> Value {
169169+fn eval_literal(l: expr.ExprLit) -> Value {
141170 case l {
142171 expr.LitString(_, s) -> StringVal(s)
143172 expr.LitNumber(_, n) -> NumberVal(n)
+7
src/parse_common.gleam
···11+// Need to find a better name for this?
22+import gleam/option.{type Option}
33+import scan.{type Token}
44+55+pub type ParseError {
66+ ParseError(tok: Option(Token), msg: String)
77+}
+14
src/parser.gleam
···11+import expr.{type ExprResult, expression}
22+import scan.{type Token}
33+import stmt.{type ManyStmtResult, stmts}
44+55+pub fn parse(tokens: List(Token)) -> ManyStmtResult {
66+ //expression(tokens)
77+ stmts(tokens)
88+ // need to validate theres no more tokens
99+}
1010+1111+fn synchronize(tokens: List(Token)) -> List(Token) {
1212+ // Seek until we find a sync point (;, or statement-beginning token)
1313+ todo
1414+}