Commit graph

53 commits

Author SHA1 Message Date
Vincent Ambo
20a6cfeee2 refactor(tazjin/rlox): Let scanner tokens own their lexeme
This removes the runtime dependency on a borrow into the program
source code.

It's not yet ideal because there are a lot of tokens where we really
don't care about the lexeme, but this is what the book does and I
am not going to change that.

Change-Id: I888e18f98597766d6f725cbf9241e8eb2bd839e2
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2394
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 16:53:02 +00:00
Vincent Ambo
1d8e3f4f8b feat(tazjin/rlox): Implement function definitions
... with this, functions now work.

Note that this bubbled up another weird code structure nit: The
parser::Function type should probably not carry its name directly.

However this doesn't matter much and I don't care right now.

Change-Id: If8e3b23f07033260433b9acd45f37c0e61fd2ff8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2393
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 15:19:01 +00:00
Vincent Ambo
56d8fa97ed feat(tazjin/rlox): Implement calling user-defined functions
This slightly jiggles around interpret_block to let callers pass in an
environment.

Change-Id: I03112a38be0e8696242d8eae8d41da8c2cc66b48
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2392
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 15:19:01 +00:00
Vincent Ambo
fe97398fd9 refactor(tazjin/rlox): Thread lifetimes through interpreter
In order to store a function in the interpreter's representation of a
callable, the lifetimes used throughout rlox need to be threaded
through properly.

This is currently not optimal, for two reasons:

* following the design of the book's scanner, the source code slice
  needs to still be available at runtime. Rust makes this explicit,
  but it seems unnecessary.

* the interpreter's lifetime is now bounded to be smaller than the
  source's, which means that the REPL no longer persists state between
  evaluations

Both of these can be fixed eventually by diverging the scanner from
the book slightly, but right now that's not my priority.

Change-Id: Id0bf694541ff59795cfdea3c64a965384a49bfe2
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2391
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 15:19:01 +00:00
Vincent Ambo
1ed34443d8 feat(tazjin/rlox): Parse function declarations
Change-Id: I1db4316563827976e5233dc7a626968f80b992ef
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2390
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 02:05:00 +00:00
Vincent Ambo
8bcbb04160 refactor(tazjin/rlox): Add helper method for parsing identifiers
Change-Id: I9a45f823f16919319d6135225d5bd53ed54c2530
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2388
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 02:05:00 +00:00
Vincent Ambo
fcd9801b01 refactor(tazjin/rlox): Let Parser::match_token take a single kind
This is much easier to read & write. It's been annoying me all the way
through.

Change-Id: Ia91756d3111a2ce3f74e1c14bccc210118d221dd
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2387
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 02:05:00 +00:00
Vincent Ambo
f4a6e9f133 test(tazjin/rlox): Add a handful of interpreter tests
Change-Id: I32dd896d42cc73d68d73093e9cbb74b48d95e041
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2386
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:52:51 +00:00
Vincent Ambo
0c1c4584cb feat(tazjin/rlox): Implement PartialEq for interpreter::Value
Values have equality, unless they're functions.

Change-Id: Ie5c623081a1fa556e6b7a5251b0ce85af68dd31a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2385
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:52:51 +00:00
Vincent Ambo
9b477975d4 feat(tazjin/rlox): Always return values from interpreter
This makes it easier to write interpreter tests, as we don't need to
look at output and such.

Change-Id: I6f8ce0cb0c482b8c00707d09e6be750c8e534176
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2384
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:31:27 +00:00
Vincent Ambo
a03b509fb8 refactor(tazjin/rlox): Constructor for interpreter with globals
Change-Id: Id8242c22500c8e2781cc656d3faabb28d9bdf091
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2383
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:31:27 +00:00
Vincent Ambo
26544aa5f0 feat(tazjin/rlox): Implement function call evaluation
Change-Id: I6767c3a1a9654475b4066415f8c026b9c5b5907a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2382
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:31:27 +00:00
Vincent Ambo
090c96eae9 feat(tazjin/rlox): Scaffolding for builtin functions
... and adds an example builtin which returns the current epoch.

The types introduced by this, especially in the interpreter module,
are going to be used for user-defined functions, too.

Change-Id: I0364a67241e94642cde08489ac711a340e30ebe8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2381
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-14 00:31:27 +00:00
Vincent Ambo
73c2b8fb85 refactor(tazjin/rlox): Wrap interpreter values in new enum
This makes it possible to distinguish between literal and other
values, such as functions.

Change-Id: I4d87b96c2988e25a61eecfeeb56188fabfd0dc40
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2367
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-13 17:03:15 +00:00
Vincent Ambo
f3c60865a3 feat(tazjin/rlox): Parse function calls
Change-Id: I1836c73dbfd5fc4ca30c2d22bbffee2fb222d566
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2366
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-13 17:03:15 +00:00
Vincent Ambo
0b4e280a07 feat(tazjin/rlox): Implement for loops via desugaring to while
Change-Id: I31a93efcc8e0c2bcb8549e2a2c05bb58d2dc74ca
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2326
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-06 23:02:31 +00:00
Vincent Ambo
d47e55ba4d feat(tazjin/rlox): Parse & interpret while statements
Change-Id: Iee772274de95dfd6a6d4af973402859aeda17b1d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2325
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-06 23:02:31 +00:00
Vincent Ambo
0a0335ae6c feat(tazjin/rlox): Parse & interpret logical operators
Change-Id: I1a7d0eda61f7f077b820dc0d2c2516e204966962
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2324
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-01-06 23:02:31 +00:00
Vincent Ambo
93122a212e feat(tazjin/rlox): Interpret if statements
Change-Id: Ic6aed29bec42098eb07e1ba9eb01dbcaae8d11e3
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2322
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2021-01-06 17:14:17 +00:00
Vincent Ambo
a89777b34f feat(tazjin/rlox): Parse if statements
Change-Id: I2352d75a3f02d65a5a2d04fb2cc4daa50f11ca1e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2321
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2021-01-06 17:14:17 +00:00
Vincent Ambo
1686355d2e refactor(tazjin/rlox): Hold shared environment ptr in interpreter
Change-Id: Ia4c4ef330be431a344d42bc00d3a518825fb9399
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2305
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2020-12-31 19:10:39 +00:00
Vincent Ambo
b55caf0338 feat(tazjin/rlox): Implement block scope in interpreter
This is currently a bit hacky because of the environment
wrapping/unwrapping, will refactor this to just keep a single Rc
around instead.

Change-Id: Iad1cbbe35112d0329248d4655a09260fc60644c8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2304
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2020-12-31 19:10:39 +00:00
Vincent Ambo
8915cd6fba feat(tazjin/rlox): Implement block parsing
Change-Id: I1b7235ed71fa36120984a36f22cd564f59581352
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2303
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-31 15:33:08 +00:00
Vincent Ambo
3c979acdf3 refactor(tazjin/rlox): Unify parser::Statement & parser::Declaration
Change-Id: I6f21b246eb9d3bf760edb3220ce6be5de5b05b08
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2302
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-31 15:33:08 +00:00
Vincent Ambo
26ed836e1d feat(tazjin/rlox): Add support for scoped environments
Adds scoped environments using a sophisticated structure known as an
SRPT, which stands for "shitty parent pointer tree".

Change-Id: I62f66aabe6eb32ea01c4cabcca5b03cfefcc28ee
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2301
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-31 15:33:08 +00:00
Vincent Ambo
48a54625ce refactor(tazjin/rlox): Separate assignment and definition
So that:

> var a = 15;
> b = 12;
Error in program: Error { line: 0, kind: UndefinedVariable("b") }
> a = 12; print a;
Number(12.0)

Change-Id: I687e95ccc2d3084e39a71bd452656ae981c95191
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2300
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-31 14:32:03 +00:00
Vincent Ambo
cc958e6730 feat(tazjin/rlox): Implement mutable variable assignment
Change-Id: I56db10a5ac26958ae27a8d4c8fa7b8f8285bc7e1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2299
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-31 14:32:03 +00:00
Vincent Ambo
8ab66f1689 refactor(tazjin/rlox): Retain interpreter state in REPL
Change-Id: Id60760e241ad0e45871b48e499f58e9831d57316
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2298
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2020-12-31 11:19:42 +00:00
Vincent Ambo
78355d3c0b feat(tazjin/rlox): Add global variable support in interpreter
Change-Id: I4134cf78dc3934a517ad0c848ae1d3729abaf882
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2297
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
2020-12-31 11:19:42 +00:00
Vincent Ambo
0f9a7b3f86 feat(tazjin/rlox): Parse variable assignment & access
Change-Id: I9894d76716d739e85a4757d9e658f884228e7f52
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2290
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-22 20:18:01 +00:00
Vincent Ambo
a104afa6ea refactor(tazjin/rlox): Introduce declarations in parser
Change-Id: I873fdd53319ec36da18926d9477e809a69dbace7
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2288
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-22 10:13:28 +00:00
Vincent Ambo
75ae25daa9 feat(tazjin/rlox): Add support for statements
First part of
https://craftinginterpreters.com/statements-and-state.html

Supports print statements, as well as evaluation for the sake of
it (i.e. future side-effects).

Change-Id: Ic6653b568f98d6cfe3f297615b7113c0ba1d9a70
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2287
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-22 10:13:28 +00:00
Vincent Ambo
5ebe28cca2 feat(tazjin/rlox): Add runtime type error handling
Change-Id: I0d52bc9ff5be6421cb4131265ed28ce1ea7d8ff3
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2282
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-20 16:25:54 +00:00
Vincent Ambo
bc6775c318 feat(tazjin/rlox): Implement tree-walk interpreter of exprs
This is only a subset of the Lox spec so far. It implements the
language up to the runtime error chapter on
https://craftinginterpreters.com/evaluating-expressions.html

Change-Id: I295dbf4b6544420d6fe80b6aaba661fb21acdea6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2281
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-20 16:25:54 +00:00
Vincent Ambo
42405bfa24 feat(tazjin/rlox): Synchronise parser state after errors
This lets the parser collect multiple errors instead of returning
after the first one, with some optimistic synchronisation after
encountering something that looks wonky.

Change-Id: Ie9d0ce8de9dcc7a3d1e7aa2abe15f74cab0ab96b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2236
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-06 17:34:57 +00:00
Vincent Ambo
1835b2be99 feat(tazjin/rlox): Wire up parser to the REPL
Change-Id: I940448c63ce105d53a0f281b6320ffb01378f207
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2235
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-06 14:58:39 +00:00
Vincent Ambo
4812fc2ee6 feat(tazjin/rlox): Implement parsing of parenthesised expressions
Change-Id: I0e6bd71fd787b719104ef93fc52df4090dc415b9
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2234
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-06 14:30:59 +00:00
Vincent Ambo
28002fcea5 refactor(tazjin/rlox): Add error plumbing in parser functions
Change-Id: I7ae3d721f76d8d69043f5ed077abbc70a18cbd92
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2233
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-06 14:30:59 +00:00
Vincent Ambo
5fcff11eae feat(tazjin/rlox): Implement parsing up to unary expressions
... with the exception of parenthesised expressions, because error
threading is not implemented yet.

Change-Id: I8d455d85e647548d5b71cbfd3d078f4970dab7fb
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2232
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-12-06 14:30:59 +00:00
Vincent Ambo
349583d5a9 feat(tazjin/rlox): Bootstrap recursive-descent parser for Lox
... mostly some AST boilerplate and a first top-level rule, plus
boilerplate similar to that set up in the Scanner.

Change-Id: I605d1de23c47a3b3702ab4f62cd3371bc3988c7d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2194
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-30 16:42:17 +00:00
Vincent Ambo
36cf7bef24 refactor(tazjin/rlox): Thread through scanner errors
... and show them to users, very crudely.

Change-Id: If4491b14db1124313f6ab7e5fbfdce9fea501d11
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2193
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 17:26:58 +00:00
Vincent Ambo
af793325c0 feat(tazjin/rlox): Scan identifiers and keywords
Change-Id: Ifec627605c23c25f199d47eaa91e441ed9590208
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2192
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:55:25 +00:00
Vincent Ambo
97505eb1e1 feat(tazjin/rlox): Implement number scanning
Change-Id: Ide0126d1c2274d56903092816ff9cd531c03f513
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2191
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:55:25 +00:00
Vincent Ambo
47aa92b87d feat(tazjin/rlox): Implement string scanning
Note that Lox does not support escapes, and I don't care about that.

Change-Id: Ie848cbc1164c4b005b15e29aad8fe723aaa68d1b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2190
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:33:32 +00:00
Vincent Ambo
800d2ccde8 fix(tazjin/rlox): Clear previous line in REPL mode
Change-Id: I8acc5b0d07b2c656f9bba76a6ddac6b9088ea563
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2189
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:33:32 +00:00
Vincent Ambo
4277d3e6b4 feat(tazjin/rlox): Handle whitespace in scanner
Change-Id: Iead3efa6aa797af5c5b57c67226205bf7e39e647
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2188
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:33:32 +00:00
Vincent Ambo
9f61579dde feat(tazjin/rlox): Scan single-line comments
Change-Id: I2efafdb1374ac2863a1f8d8a9310123a7dec0900
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2187
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-28 16:33:32 +00:00
Vincent Ambo
46c6906aaa chore(tazjin/rlox): Wire scanner to interpreter to reduce warnings
... they're just noisy at the moment. This isn't complete because it
doesn't thread through scanner errors.

Change-Id: I0f75d2b20fa3f57be1af5d1d8aa8059856855825
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2162
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-27 17:29:04 +00:00
Vincent Ambo
3f6b88bce2 feat(tazjin/rlox): Implement multi-character scanning
Change-Id: Ic5a246a7f5834477aeb97824fa30ba74a8422bc1
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2161
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-27 17:29:04 +00:00
Vincent Ambo
6363efbebf refactor(tazjin/rlox): Use &[char] instead of &str in scanner
This makes it easier to work with the Unicode issue. The original
string representation can be discarded.

Change-Id: I740be4cb9654679ea7950f3899c5c709b1e7a739
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2160
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2020-11-27 17:29:04 +00:00