Commit graph

312 commits

Author SHA1 Message Date
616565bb0d Token - Helper methods to better handle identifiers 2023-01-08 11:22:14 +01:00
0cebffbf9b AST - Getter expression 2023-01-08 11:04:32 +01:00
7306fa0cfa Parsed - Fixed class parser 2023-01-08 10:58:02 +01:00
af68acde70 Clippy, clippy, clippy! 2023-01-08 10:44:46 +01:00
d8dba3ac5f Rewrote value storage and implemented class instantiation
* Probably not the last time.
  * Object-like things (functions, classes, etc...) are stored as
    ref-counted cells.
  * Separate data structure for native functions.
  * with_callable() method on value to run specific code on objects
    that are callable
  * Instance type added.
  * Instance construction implemented
2023-01-08 10:40:36 +01:00
85e9c7db38 Interpreter - Callables now receive the callee value as an argument 2023-01-08 07:58:56 +01:00
692531ca65 Interpreter - Class declarations 2023-01-07 14:21:10 +01:00
f834d84365 Interpreter - Class values 2023-01-07 14:15:04 +01:00
6fa335b2f6 Interpreter - Basic, mostly empty class data structure 2023-01-07 14:14:45 +01:00
afb465d6df Interpreter - Use Value.to_string() for print statements 2023-01-07 14:14:24 +01:00
621ca9d9f1 Interpreter - Class submodule 2023-01-07 14:08:31 +01:00
9bfb549a22 Resolver - Class declarations 2023-01-07 14:07:59 +01:00
5702abe44d Parser - Parse classes
* New FunctionKind value for methods (with only 254 arguments)
  * Class parsing
  * Some minor refactoring of function parsing
2023-01-07 14:05:17 +01:00
36026681f7 AST - Added class declaration statements 2023-01-07 13:53:43 +01:00
1af25457d5 AST - Refactored function declarations as a separate struct 2023-01-07 12:18:18 +01:00
6252bed605 Happy clippy is happy (and Clippy) 2023-01-07 11:59:32 +01:00
8741692fad Resolver - Store declaration tokens as references 2023-01-07 11:55:41 +01:00
34991d4b4b Resolver - Report an error if a symbol isn't used 2023-01-07 11:41:04 +01:00
670b50e8cd Scanner - Allow identifiers with a leading '_' 2023-01-07 11:39:19 +01:00
4bce85e14b Resolver - Errors on undefined symbols 2023-01-07 11:10:24 +01:00
06917ca2d6 Resolver - Split resolve_local() into specific methods 2023-01-07 11:06:22 +01:00
24d9d6d880 Resolver - Handle the global namespace as well 2023-01-07 10:58:02 +01:00
c971df6f60 Resolver - Refactored declare() 2023-01-07 10:53:05 +01:00
8d65c288a3 Resolver - Refactored entering/exiting scopes 2023-01-07 10:51:34 +01:00
6dceae73a0 Resolver - Additional checks
* Ensure all locals are defined before they are used.
  * Prevent functions declared using fun from being assigned to.
  * Mark locals as used when they are accessed.
2023-01-07 10:17:08 +01:00
a89be8632c Missed a rename in previous commit 2023-01-07 09:17:02 +01:00
95ddd34f9c Interpreter - Renamed resolved variables field 2023-01-07 09:01:24 +01:00
363cdab86f Interpreter - Fixed closures
* Environment for function execution is now based on their
    declaration.
  * I had missed that part while skimming over the book.
2023-01-07 08:59:13 +01:00
ec70ded29e Fixed variable lookups and assignments 2023-01-07 08:48:21 +01:00
3117dfeac5 Interpreter - Lookups and assignment based on resolver results
* Does not work. Using pointers was a bad idea.
2023-01-07 08:24:27 +01:00
bd156e619f Trying to implement variable lookup and failing hard
* I'll probably have to rewrite environments as a Vec<HashMap> to make
    things simpler
2023-01-06 08:05:33 +01:00
c97ad0ad7e Interpreter - Made the interpreter state partially public
* This allows Callable to be public, which is required for Value
  * State internals are still hidden behind pub(super)
2023-01-06 07:47:45 +01:00
10223cbb4e Interpreter - WIP refactor to prepare for using resolved variables 2023-01-05 07:54:18 +01:00
d528ce8dc3 Interpreter - Limited scope of some declarations 2023-01-05 07:21:43 +01:00
754659ed12 Resolver - Removed invalid fix mistakenly committed in 79a0667 2023-01-05 07:13:20 +01:00
c90731b62d Resolver - Comments 2023-01-05 07:12:21 +01:00
64bc8312dd Resolver - resolve_function() shouldn't be a method from ResolverState 2023-01-05 07:09:35 +01:00
b5573cee3b Resolver - Fixed off-by-one error in resolve_local() 2023-01-05 07:06:27 +01:00
79a0667f34 Resolver - Errors on duplicate declarations 2023-01-05 06:58:29 +01:00
c1a61b992d Scanner - Style clean-up 2023-01-05 06:43:54 +01:00
c5f099340b Errors refactoring - Code compiles. 2023-01-04 07:58:44 +01:00
743379c516 Errors refactoring for the iterpreter 2023-01-04 07:49:28 +01:00
7961a92ad1 Further attempts at refactoring the error handling code
* Everything's still broken though
2023-01-04 07:35:40 +01:00
0443754007 Parser - Refactored error handling 2023-01-03 23:07:49 +01:00
acb29e7123 Resolver - Refactored error handling 2023-01-03 22:50:47 +01:00
36ac55d286 Errors - ErrorKind to program exit code 2023-01-03 22:44:48 +01:00
a59dc21223 Errors - Result subtype using SloxError 2023-01-03 22:40:36 +01:00
d3398e5f79 Errors - Added ErrorKind::Scan 2023-01-03 22:40:24 +01:00
d0d4038272 Errors - ErrorHandler.report() consumes the error 2023-01-03 22:40:01 +01:00
260b19030f Scanner - Refactored to use new error handling 2023-01-03 22:38:57 +01:00
e152e40678 Errors - Refactoring
* This will break the whole thing but the error handling was getting
    quite messy.
2023-01-03 22:17:11 +01:00
1346e0ccf0 Resolver - Return the map of resolved variables 2023-01-03 12:56:40 +01:00
376f28044c Resolver - Fixed function handling
* Since the arguments are stored in an intermediate environment, an
    additional scope is required
2023-01-03 12:55:48 +01:00
5a12ce44c1 Resolver - Initial implementation
* Not sure about using pointers to Expr nodes in order to remember how
    they can be resolved.
  * Unused and untested.
2023-01-03 08:50:12 +01:00
c8be65dc4c Interpreter - Remove checks for duplicate argument names 2023-01-02 21:49:45 +01:00
29d3677b2a Parser - Detect duplicate argument names 2023-01-02 21:49:16 +01:00
db781ed00f HAPPY CLIPPY IS HAPPY!!!! 2023-01-02 21:44:02 +01:00
36c842d7ab Parser - Cleaning up after field removal 2023-01-02 21:40:30 +01:00
46389d2962 AST - Removed field missed in previous changes 2023-01-02 21:38:33 +01:00
f1145bfbdf Interpreter - Lambda support 2023-01-02 21:37:56 +01:00
0ef1318a35 Interpreter - Function name is optional (lambdas...) 2023-01-02 21:37:29 +01:00
ab46d0bcef AST - Removed useless field from Lambda 2023-01-02 21:36:50 +01:00
2881eb5a61 Parser - Lambda functions 2023-01-02 21:24:59 +01:00
4769a2a7f3 AST - Lambda functions 2023-01-02 21:01:45 +01:00
783c10067b Parser - Fixed parsing empty function parameters 2023-01-02 20:53:14 +01:00
12b2855fb1 Parser - Consume ';' after return statements 2023-01-02 20:48:38 +01:00
3dea0c9a45 Parser - Fixed can_use_return() 2023-01-02 20:47:12 +01:00
d6ea1c3099 Interpreter - Handle return value in functions 2023-01-02 20:46:34 +01:00
0de6b927b5 Interpreter - Return statement 2023-01-02 20:41:59 +01:00
3bd3c31210 Parser - Prevent return from being used outside of functions 2023-01-02 20:29:32 +01:00
0edabd4a48 Parser - Fixed loop parsing state in function bodies 2023-01-02 20:23:43 +01:00
549e93e9a9 Parser - Fixed comment 2023-01-02 20:21:52 +01:00
0290fbc226 Parser - Return statement 2023-01-02 20:20:47 +01:00
9b9103c170 AST - Added return statement 2023-01-02 20:16:14 +01:00
e4a86eb1de AST - Fixed statement nodes with *Stmt names 2023-01-02 20:13:51 +01:00
6acf492aa2 Interpreter - Handle function definitions 2023-01-02 20:08:47 +01:00
cf3284cd88 Interpreter - Handle errors for multiple definitions of an argument 2023-01-02 20:08:05 +01:00
7b20ec2f3a Interpreter - Define functions from name/params/body
* Used to be defined from statement, but this is cleaner and easier
2023-01-02 20:07:15 +01:00
c23ce47420 Parser - Fixed comment 2023-01-02 20:06:56 +01:00
5d1d3bd0a4 Parser - Fixed function call parsing 2023-01-02 20:06:36 +01:00
360ec57914 Interpreter - Fixed typo 2023-01-02 20:06:12 +01:00
8b74cd932d Errors - Position for interpreter errors 2023-01-02 20:05:49 +01:00
ca3ec46bdc Interpreter - Data structure for functions 2023-01-02 19:50:55 +01:00
f02d15fa83 Interpreter - Scope change for a few functions 2023-01-02 19:49:58 +01:00
e963a9f7ca Interpreter - New submodule for functions 2023-01-02 18:58:20 +01:00
250eddea71 Parser - Parse function declarations 2023-01-02 18:57:25 +01:00
9c7445d904 AST - Added function to extract all block statements 2023-01-02 18:56:26 +01:00
cd731d387a Parser - Renamed method 2023-01-02 18:33:20 +01:00
3738fb4f00 AST - Function declarations 2023-01-02 18:31:11 +01:00
0a38903154 I <3 CLIPPY 2023-01-02 18:23:12 +01:00
9d555acae0 Interpreter - Default environment includes native functions 2023-01-02 18:20:23 +01:00
24b57d35d0 Interpreter - clock() native function 2023-01-02 18:20:02 +01:00
7b8405119b Interpreter - CallableRef type alias 2023-01-02 18:19:45 +01:00
d450f186b4 Interpreter - Added the native_fn empty mod 2023-01-02 17:57:34 +01:00
113fffb872 Interpreter - Environment::default() implemented manually 2023-01-02 17:55:05 +01:00
6a227c96ee Interpreter - Fixed silly english/french confusion 2023-01-02 17:49:35 +01:00
3750b5226b Interpreter - Check arity before calling 2023-01-02 17:47:53 +01:00
d47adab0f8 Interpreter - Call implementation 2023-01-02 17:45:56 +01:00
8ab144f3c5 Interpreter - Move function call arguments 2023-01-02 17:45:19 +01:00
1ad55e95f5 Interpreter - Use EnvironmentRef in Callable 2023-01-02 17:44:51 +01:00
34619a8125 Interpreter - Callable extends Debug and ToString 2023-01-02 17:40:06 +01:00
696a363ec6 Interpreter - Implement PartialEq manually for values 2023-01-02 17:39:31 +01:00
a4875ff876 Interpreter - Actually use the callable module 2023-01-02 16:04:44 +01:00
3b5778ff47 Interpreter - Function re-ordering 2023-01-02 16:00:10 +01:00
b1d0db5ea4 Interpreter - Callable interface definition 2023-01-02 15:54:50 +01:00
fecea3b388 Parser - Support for calls with arbitrary expressions as the callee 2023-01-02 15:32:33 +01:00
4c55e9e784 AST - Function calls modified to match the book's 2023-01-02 15:23:33 +01:00
312cdf18d5 Parser - Maximum argument count for functions 2023-01-02 15:18:02 +01:00
acbce309fa Parser - Support for function calls 2023-01-02 15:15:34 +01:00
2e7a897c47 AST - Function call expression node 2023-01-02 15:05:41 +01:00
a317e54426 CLIPPY IS GOD. 2023-01-02 14:10:32 +01:00
2f0798bfe1 Interpreter - Implemented new version of the loop statement 2023-01-02 12:18:00 +01:00
4c54643a8d Parser - Use new loop AST node 2023-01-02 12:10:37 +01:00
c407fcd546 Parser - Improved recovery after break/continue w/ unknown label 2023-01-02 12:07:10 +01:00
ca76b3ab3f AST - Changed loop representation 2023-01-02 12:06:37 +01:00
06ae3dd973 Parser - Fixed named loop finder. 2023-01-02 12:00:46 +01:00
7541a8bda6 Interpreter - Support for loop labels 2023-01-02 11:26:12 +01:00
2599c0ebdc Interpreter - Don't return interpreter results from the environment's methods 2023-01-02 11:25:48 +01:00
14d5b94f76 AST - Fixed loop label dump 2023-01-02 11:25:18 +01:00
c5c8b04355 Parser - Removed unused code 2023-01-02 11:25:02 +01:00
c36654fb7e Parser - Labelled loops 2023-01-02 10:44:37 +01:00
2f44a81b6d AST - Added labels to while statements 2023-01-02 10:37:47 +01:00
bf8eee7ecb Parser - Loop control statements
* Store a loop parsing state when entering a loop. The parser uses
    this to cause an error when break/continue are found outside a loop.
  * Parse break and continue statements w/ optional identifier
2023-01-02 10:25:48 +01:00
f3b2552679 Tokens - Address ('@') token for loop labels 2023-01-02 10:00:05 +01:00
48b86d5087 AST - Break/Continue with label 2023-01-02 09:57:42 +01:00
154d072ca8 AST - Break and continue 2023-01-01 19:55:30 +01:00
a403799d22 Scanner - break + continue keywords 2023-01-01 19:52:02 +01:00
f8f9d376fb Tokens - Break + Continue 2023-01-01 19:51:10 +01:00
b9e659350b Parser - Re-use for loop body if it's a block and an incr statement is needed 2023-01-01 19:47:04 +01:00
f95fcc4e3e Parser - Initial implementation of the for loop 2023-01-01 19:41:02 +01:00
14bff1d7bc AST - Fixed block dump 2023-01-01 19:40:47 +01:00
d8888fd15f Parser - Re-added parens around if / while conditions
Mostly because lox's for loop is C-like and would feel weird without
parens.
2023-01-01 19:04:37 +01:00
ddf6625326 Interpreter - While loops 2023-01-01 18:44:35 +01:00
daec88c2f8 Parser - While loops 2023-01-01 18:40:05 +01:00
529a588900 AST - While loops 2023-01-01 18:33:45 +01:00
a671836655 Interpreter - Support for logical or / and 2023-01-01 18:27:45 +01:00
79c594afa9 Interpreter - Fixed == operator. Oops. 2023-01-01 18:27:33 +01:00
5db3caab61 Parser - Fixed comments 2023-01-01 18:13:32 +01:00
2e0e3f9ef0 Parser - Support for and / or 2023-01-01 11:18:08 +01:00
0637e52c83 AST - Logical binary expressions 2023-01-01 11:13:41 +01:00
9a84283245 Interpreter - If statement 2023-01-01 11:10:48 +01:00
8711fde112 Parser - Support for if statement
* Different from the book's implemenation as it doesn't use additional parens
2023-01-01 11:04:32 +01:00
2eda13de38 AST - Conditional statement added 2023-01-01 10:58:45 +01:00
81aef09c5b Interpreter - Additional errors for variables
* Uninitialized variable usage
  * Redefining variables
2023-01-01 10:52:29 +01:00
e92628a4eb Interpreter - Nested environments 2022-12-31 17:27:09 +01:00
d9e3ef2623 Environment - Rc<RefCell<...>> to store the parent 2022-12-31 17:26:40 +01:00
7d22b15854 Parser - Support for blocks 2022-12-31 17:05:58 +01:00
3fe2b4256a AST - Blocks 2022-12-31 16:58:48 +01:00
c71bdd8c87 Environment - Attempt at nesting support 2022-12-31 16:56:00 +01:00
71ddef17d8 Parser - Fixed error recovery 2022-12-31 16:42:32 +01:00