greg
26bc6e90f3
Lamba calls partially work
2017-09-19 22:10:59 -07:00
greg
b0655d7cab
need to flush stdout for printing
2017-09-19 22:10:59 -07:00
greg
a46ede9395
Made evaluation-printing more sophisticated
2017-09-19 22:10:59 -07:00
greg
d9ab5a58cf
Add some methods to llvm_wrap
2017-09-19 22:10:59 -07:00
greg
77297c7e06
Add lambdas
2017-09-19 22:10:59 -07:00
greg
d93b5c0a2e
Still cranking away at conditional compilation
2017-09-19 22:10:59 -07:00
greg
0b9dc113d1
CLoser to working now
2017-09-19 22:10:59 -07:00
greg
d6fc13f08d
Fix a couple of problems
2017-09-19 22:10:59 -07:00
greg
825c271b17
More work on codegen for conditionals
...
Still doesn't compile
2017-09-19 22:10:59 -07:00
greg
8c4f7e141a
Compiling if statements like half done
2017-09-19 22:10:59 -07:00
greg
12fbc51da1
Compile multi-expression source programs
2017-09-19 22:10:59 -07:00
greg
7ddb421ced
Exit cleanly on opt parse fail
2017-09-19 22:10:59 -07:00
greg
1631bb0a04
Fix tests for conditionals
2017-09-19 22:10:59 -07:00
greg
5923cc2317
Kill then, else keywords
2017-09-19 22:10:59 -07:00
greg
1fa56800c5
Convert parsing while, if, fn exprs to use { }
2017-09-19 22:10:59 -07:00
greg
2b4d3e8516
Add support for curly braces and brackets
...
Gonna make this a curly-brace language, I like those better. Shoulda
done that to begin with.
2017-09-19 22:10:59 -07:00
greg
9b74527618
Control printing eval steps with flags
2017-09-19 22:10:59 -07:00
greg
d23e5bff35
Add an Op type for binop operators
...
Soon this will get swapped in as the way that BinOps are evaluated
2017-09-19 22:10:59 -07:00
greg
3a4f5ae840
Change name Op -> OpTok
...
So that I can make an Op type for the ASTNode
2017-09-19 22:10:59 -07:00
greg
298194c42d
Finish support for assignment operators
2017-09-19 22:10:59 -07:00
greg
23d2209d8b
Implementing a few more operators
...
WIP - not done
2017-09-19 22:10:59 -07:00
greg
4cf165b408
Use buffered reader for stdout
...
Not sure ifthis is actually helping
2017-09-19 22:10:59 -07:00
greg
154839979b
Add nicer handle_builtin method
2017-09-19 22:10:59 -07:00
greg
538f0b18f4
Evaluate while loop
2017-09-19 22:10:59 -07:00
greg
dc81d237c5
Reduce re-allocations in eval
2017-09-19 22:10:58 -07:00
greg
8651839a66
Getting rid of some newlines - concision
2017-09-19 22:10:58 -07:00
greg
f6e5ea250d
Convert while_expr to delimiter_block! too
2017-09-19 22:10:58 -07:00
greg
9801f53a17
Moved conditionals to delimiter_block! syntax
2017-09-19 22:10:58 -07:00
greg
db92292569
Fixed all tests
2017-09-19 22:10:58 -07:00
greg
e1ce54aece
Add delimiter_block macro
2017-09-19 22:10:58 -07:00
greg
c227ad656f
Parser simplifications, renames, etc.
2017-09-19 22:10:58 -07:00
greg
b45d09e81a
Don't need this reference
2017-09-19 22:10:58 -07:00
greg
761500b9d6
Some cleanups in Parser
...
-get rid of some use statements
-mkae error messages better
2017-09-19 22:10:58 -07:00
greg
e888e82404
Remove some unnecessary destructurings of Rc<String>
2017-09-19 22:10:58 -07:00
greg
328ec4ba87
Convertd like half the Strings to RC
...
-still need to eliminate some clones in eval, parse
+ fix all the tests
2017-09-19 22:10:58 -07:00
greg
4a7b570603
Parser changes - add precedences, move definitions
...
Move impls of Display for AST subtypes closer to where they are defined
2017-09-19 22:10:58 -07:00
greg
7eb48fb4ef
Working on compilation again
2017-09-19 22:10:58 -07:00
greg
8ebf1b3056
Add parser support for while statements
2017-09-19 22:10:58 -07:00
greg
905431b33c
Change name: ASTNode -> Statement
2017-09-19 22:10:58 -07:00
greg
2996198eff
lookup_binding only needs &str
2017-09-19 22:10:58 -07:00
greg
06771979df
Function bodies can contain statements now
2017-09-19 22:10:58 -07:00
greg
f158b6c712
Converted to multiple-evaluator logic
...
Now I have (basically) full single-step evaluation and it works fine
2017-09-19 22:10:58 -07:00
greg
ba8f67441f
Conditionals - handle delimiters correctly
2017-09-19 22:10:58 -07:00
greg
872e9ce7ee
Make function binding a SideEffect
2017-09-19 22:10:58 -07:00
greg
edf342e65a
Add == operator
2017-09-19 22:10:58 -07:00
greg
27d4c2ccbd
No references in pattern-matching
2017-09-19 22:10:58 -07:00
greg
6794d22f1d
Run rustfmt on eval.rs, parser.rs
2017-09-19 22:10:58 -07:00
greg
1858d26638
Add comparison operators
...
+ make operator evaluation more concise
2017-09-19 22:10:58 -07:00
greg
84fbe73cf6
Add Lambda type
...
And change name FuncNode -> FuncDefNode
Now function definition nodes reduce to a Lambda, which is not
reducible.
2017-09-19 22:10:58 -07:00
greg
ad994c38ae
Test simplification
2017-09-19 22:10:58 -07:00
greg
48343d3fad
Tightened tokenization tests
2017-09-19 22:10:58 -07:00
greg
4f8ff35d0f
fixed bug with ends_identifier
2017-09-19 22:10:58 -07:00
greg
7311d0311f
Simplify pattern a little bit
2017-09-19 22:10:58 -07:00
greg
1b59c264b4
Use itertools peeking_take_while
...
Cuts down on lines in the tokenizer
2017-09-19 22:10:58 -07:00
greg
b2e453a9de
Rewrite of tokenizer
2017-09-19 22:10:58 -07:00
greg
59226eb731
Ran rustfmt on parser.rs
2017-09-19 22:10:58 -07:00
greg
297003c0b0
Operator only needs to be a tuple struct
2017-09-19 22:10:58 -07:00
greg
e5ee072b00
Convert tokenizer to large match statement
...
In the hopes of making it shorter
2017-09-19 22:10:58 -07:00
greg
9b62efc830
Fix conditional parsing
...
Needed to account for semicolons/newlines. Maybe need to generalize
delimiter-separated list of things
2017-09-19 22:10:58 -07:00
greg
f626ca1427
Add test for conditional parsing
2017-09-19 22:10:57 -07:00
greg
82c52ede48
Finish evaluating conditionals
2017-09-19 22:10:57 -07:00
greg
7f52b20d97
Conditional eval partway implemented
...
Need to change the AST representation to support compound statements I
think
2017-09-19 22:10:57 -07:00
greg
12fee6158c
Vector'd expressions don't need to be boxed
2017-09-19 22:10:57 -07:00
greg
2d21de7cc3
Added support for conditionals to parser
...
Not to eval yet
2017-09-19 22:10:57 -07:00
greg
9cc9c5977d
Fixed evaluation of function calls
...
This bit still isn't quite small-step but maybe that's okay for
functions
2017-09-19 22:10:57 -07:00
greg
ed9d1312d1
Change representation of variables
2017-09-19 22:10:57 -07:00
greg
29d9e50311
All environment changes represented explicitly
...
Start the work of rewriting the evluator to be a true small-step
evaluator - that is, all state changes are represented explicitly as
SideEffect types, and not as methods called on the evaluator, except at
the very top of the evaluation loop
2017-09-19 22:10:57 -07:00
greg
e84550f3ec
Kill two compilation warnings
2017-09-19 22:10:57 -07:00
greg
3063de1242
Run rustfmt on the rest of them
2017-09-19 22:10:57 -07:00
greg
e1d07b4e66
Rustfmt on llvm_wrap
2017-09-19 22:10:57 -07:00
greg
af45004afa
Run rustfmt on some files
2017-09-19 22:10:57 -07:00
greg
d4d61ce5ad
Use process::exit in main
2017-09-19 22:10:57 -07:00
greg
743311d18a
Convert Tokenize to Result
2017-09-19 22:10:57 -07:00
greg
17f9846bb9
Make tests pass w/ new match syntax
2017-09-19 22:10:57 -07:00
greg
fe8418edbe
Kill some extraneous spaces
2017-09-19 22:10:57 -07:00
greg
1d8102b9fa
Make compilation controllable
2017-09-19 22:10:57 -07:00
greg
aac3ca40fe
Add getopts
2017-09-19 22:10:57 -07:00
greg
c389b44bf8
Compile statements with variables
2017-09-19 22:10:57 -07:00
greg
db52f9b716
Package compilation context into one struct
2017-09-19 22:10:57 -07:00
greg
d3a743442b
= should have high precedence
2017-09-19 22:10:57 -07:00
greg
e46d840d96
Move more code to llvm_wrap
...
And silence a few compiler warnings
2017-09-19 22:10:57 -07:00
greg
3d406f1dd2
Move llmv wrapper into separate file
2017-09-19 22:10:57 -07:00
greg
fca307d3ab
Package more functions in LLVMWrapper
2017-09-19 22:10:57 -07:00
greg
a65544356c
Fix bug in delete routine
2017-09-19 22:10:57 -07:00
greg
10d51cc29c
Compile binexps
2017-09-19 22:10:57 -07:00
greg
95b773de7f
Compilation sequence
...
-move all steps of the llvm IR compilation process into the binary
2017-09-19 22:10:57 -07:00
greg
c032da712f
Successfully compiling a main function
2017-09-19 22:10:57 -07:00
greg
cfb93d9dea
Compilation that returns an output code works
2017-09-19 22:10:57 -07:00
greg
08798fb690
Move all LLVM functions into LLVMWrap
...
so I can kill the global unsafe
2017-09-19 22:10:57 -07:00
greg
e0eef5e58f
More moving functions around
2017-09-19 22:10:57 -07:00
greg
2107e6344e
More function wrapping
2017-09-19 22:10:57 -07:00
greg
2ad65a1c5d
Some in-progress work
2017-09-19 22:10:57 -07:00
greg
a01b6c874e
Small-step function arg evaluation
2017-09-19 22:10:57 -07:00
greg
907af38f44
Evaluate printing
2017-09-19 22:10:57 -07:00
greg
923566c4e9
Get rid of println's for token/ast debugging
...
Instead just explicitly stick them into the returned string.
This is necessary 'cause I'm gonna convert simplerepl to use ncurses
soon, so I can't have any side effects
2017-09-19 22:10:57 -07:00
greg
96c51a9b88
Move some more unsafe code into block
2017-09-19 22:10:57 -07:00
greg
8528c912bd
Added side effect framework
2017-09-19 22:10:57 -07:00
greg
47f4c25020
Doing some wrapping
2017-09-19 22:10:56 -07:00
greg
c18c1a639a
compilation does something usefl
...
Following along with:
http://blog.ulysse.io/2016/07/03/llvm-getting-started.html
2017-09-19 22:10:56 -07:00
greg
d3f6bbabaa
Starting to add actual LLVM generating code
2017-09-19 22:10:56 -07:00
greg
ee12e10ac6
Fix slice syntax
2017-09-19 22:10:56 -07:00
greg
6a0b50f278
Kill hashmap import for now
2017-09-19 22:10:56 -07:00
greg
6c44d295db
Framework for compilation
2017-09-19 22:10:56 -07:00
greg
cd69ebaa9d
Split main() into subfunctions
2017-09-19 22:10:56 -07:00
greg
3fe9ec95d5
Fix repl error message
2017-09-19 22:10:56 -07:00
greg
8b5d1ecd15
Kill compilation for now
...
Don't wanna deal with this right this second
2017-09-19 22:10:56 -07:00
greg
272fa92052
More fleshing out
2017-09-19 22:10:56 -07:00
greg
0c717c721e
Import Function type
2017-09-19 22:10:56 -07:00
greg
64d560a1fc
Still more work
2017-09-19 22:10:56 -07:00
greg
8a92d5ffa8
Partial LLVM work
2017-09-19 22:10:56 -07:00
greg
5ed0ed727b
Starting to add LLVM code
2017-09-19 22:10:56 -07:00
greg
5428810d2c
Add llvm dependencies
2017-09-19 22:10:56 -07:00
greg
b48c007bca
Get rid of old evaluator file
...
No longer need it
2017-09-19 22:10:56 -07:00
greg
5aa4c404a5
Added conditionals to grammar
2017-09-19 22:10:56 -07:00
greg
0e3aaa8b08
Add conditional expression support
2017-09-19 22:10:56 -07:00
greg
f33cfdadfe
Fix variable lookup order
...
Evaluator uses frames as a stack, so to find the most-recent variable
binding we have to iterate through it the reverse way. This fixes a bug
manifested by:
fn a(x)
x + 20
end
fn b(x)
a(x) + 20
end
2017-09-19 22:10:56 -07:00
greg
231de69084
Added infrastructure for reading files
2017-09-19 22:10:56 -07:00
greg
f014c1a9d9
Kill compiler warnings
2017-09-19 22:10:56 -07:00
greg
c36bc3377e
Fix lookup_binding in function call case
2017-09-19 22:10:56 -07:00
greg
5eba222679
Variable binding in fucntion call work
2017-09-19 22:10:56 -07:00
greg
dcf89aa429
Move lookup_function back onto Evaluator
...
THe problem was that we were borrowing the output of the inner HashMap,
if we clone it we don't borrow anything
2017-09-19 22:10:56 -07:00
greg
1ffbeb6472
Return last value out of function
2017-09-19 22:10:56 -07:00
greg
f8a521fc9b
Start making function calls work
...
This commit isn't fully done yet
2017-09-19 22:10:56 -07:00
greg
77f72806be
Add support for multiple frames
2017-09-19 22:10:56 -07:00
greg
dcde5d6018
Start function call reduction
...
Move the varmap and funcmap functions to the Evaluator, to mkae it
easier to facilitate separate frames
2017-09-19 22:10:56 -07:00
greg
6bb227d052
Rename methods
...
make reduce() the entry point to evaluation
2017-09-19 22:10:56 -07:00
greg
29d4cb53a4
Add infrastructure to do function evaluation
...
Right now you can successfully evaluate a function definition (returning
Null), but cannot call a function
2017-09-19 22:10:56 -07:00
greg
3915c1f035
Remove println from reduction
2017-09-19 22:10:56 -07:00
greg
b400796e4d
Get rid of test variable input
2017-09-19 22:10:56 -07:00
greg
96e6a87f64
Add string concat
2017-09-19 22:10:56 -07:00
greg
b1f9e5cefc
Fix variable lookup
2017-09-19 22:10:56 -07:00
greg
be36d4697d
Pretty-print evaluated AST nodes
2017-09-19 22:10:56 -07:00
greg
ce8c511929
Evaluate additional operators
2017-09-19 22:10:55 -07:00
greg
a8cafa8c64
Move Evaluator state into interpreter state
2017-09-19 22:10:55 -07:00
greg
229e6ae733
More expression parsing work
2017-09-19 22:10:55 -07:00
greg
e9dd0d9ae8
Add concept of Null expression
...
Finally, the null-only behavior is starting to manifest itself!
2017-09-19 22:10:55 -07:00
greg
15d4317191
Add null expression
2017-09-19 22:10:55 -07:00
greg
7114e446a4
Adding, subtracting works
2017-09-19 22:10:55 -07:00
greg
044f534ac5
Start implementing variable lookup
2017-09-19 22:10:55 -07:00
greg
d3207ad890
Move evaluation logic back into methods
...
They need to be able to access the environment which is stored in the
Evalator struct
2017-09-19 22:10:55 -07:00
greg
19fffd5063
Variable binding infrastructure
2017-09-19 22:10:55 -07:00
greg
785c916ece
Start reducing ASTs
...
Start writing code to reduce AST nodes
q
2017-09-19 22:10:55 -07:00
greg
5a9ebb188d
Make Evaluable trait
2017-09-19 22:10:55 -07:00
greg
16e8d969be
Add basic evaluation
2017-09-19 22:10:55 -07:00
greg
70bf68d9bd
More concision in parser
2017-09-19 22:10:55 -07:00
greg
f53c14535b
Made error! macro more programtic
...
TODO implement Display on Token so we're not just displaying the debug
name of the token enum variants
2017-09-19 22:10:55 -07:00
greg
4f96abd7d9
Changes to make the code more concise
2017-09-19 22:10:55 -07:00
greg
fdaf4c302c
Fix all compiler warnings
2017-09-19 22:10:55 -07:00
greg
8ce53d7c72
Fix bind error
2017-09-19 22:10:55 -07:00
greg
428d560e2a
Add tests for call expr parsing
2017-09-19 22:10:55 -07:00
greg
80bc7ec089
Proper call expression parsing
2017-09-19 22:10:55 -07:00
greg
e6591b80d9
Add paren test
2017-09-19 22:10:55 -07:00
greg
e099f713ad
Add binop parsing test
2017-09-19 22:10:55 -07:00
greg
9b54256521
Import types for breivty
...
and rename function to be explicit
2017-09-19 22:10:55 -07:00
greg
087402ece6
Add more tests
...
Need to use box patterns
2017-09-19 22:10:55 -07:00
greg
252b6e8bd9
Okay, this strategy makes the test work
2017-09-19 22:10:55 -07:00
greg
b1163e2ae4
Operator-precedence parsing + tests
...
The tests are crippled now, because it's hard to write a test macro that
can also match on Strings
2017-09-19 22:10:55 -07:00
greg
032d01c9f5
Fix tokenization bug
2017-09-19 22:10:55 -07:00
greg
c4ab1ed105
Fix tokenizer tests
2017-09-19 22:10:55 -07:00
greg
9a257f08d7
Introduce Op type
...
For operator parsing
2017-09-19 22:10:55 -07:00
greg
47d56a7b44
fix operator parsing
2017-09-19 22:10:55 -07:00
greg
1f7ae2e30f
Paren expression
2017-09-19 22:10:55 -07:00
greg
e3c8753a4d
Expression parsing
2017-09-19 22:10:55 -07:00
greg
e1aa7ecb17
Finish tokenizing Op separately
2017-09-19 22:10:55 -07:00
greg
f09a6e14ba
Tokenizer work to support operators
...
work in progress but committing to transfer
2017-09-19 22:10:55 -07:00
greg
31da25a66e
Expression parsing work
2017-09-19 22:10:55 -07:00
greg
fff9cb7d25
Fix functin parsing
2017-09-19 22:10:55 -07:00
greg
db1e188fdb
Move grammar to top of file
2017-09-19 22:10:55 -07:00
greg
935185ed92
more parsing
2017-09-19 22:10:55 -07:00
greg
0999cbe28e
More parsing work
2017-09-19 22:10:55 -07:00
greg
674f70a428
Convert parsing to method-based
2017-09-19 22:10:54 -07:00
greg
b1b6672399
Implement function parsing
...
With a lot of dummy code, especially around expression parsing
2017-09-19 22:10:54 -07:00
greg
bd1c455dc8
Basic infrastructure parses
...
Also got rid of EOF, don't need it
2017-09-19 22:10:54 -07:00
greg
b62ef43f07
Add basic BNF grammar
2017-09-19 22:10:54 -07:00
greg
09b67dc3f7
Change error message
2017-09-19 22:10:54 -07:00
greg
a613fa73e5
Basic parsing framework
2017-09-19 22:10:54 -07:00
greg
8c473c554e
Fix bug
2017-09-19 22:10:54 -07:00
greg
3e04cbfa29
Add comma tokenization
2017-09-19 22:10:54 -07:00
greg
570650cbfa
Finish keyword tokenization
2017-09-19 22:10:54 -07:00
greg
49be163181
Add test to ignore
...
For better handing of user-defined operators, which I will do in the
future
2017-09-19 22:10:54 -07:00
greg
b4f93acbd8
Couple more tests
2017-09-19 22:10:54 -07:00
greg
8c65ae3214
Macro-ize token tests
2017-09-19 22:10:54 -07:00
greg
e436533638
Passing test
2017-09-19 22:10:54 -07:00
greg
4601a56867
Start working on tokenization tests
2017-09-19 22:10:54 -07:00
greg
2f7a1850db
Finish tokenizing
2017-09-19 22:10:54 -07:00
greg
71aef379d3
Tokenize number literals
...
TODO: expand this bit of code to handle 0x12, etc. syntax
2017-09-19 22:10:54 -07:00
greg
8662a3ba0e
Make tokenize error-able
2017-09-19 22:10:54 -07:00
greg
5ca98c7d77
Print tokeniziation
2017-09-19 22:10:54 -07:00
greg
13cde3106c
Start making tokenizer changes
...
Hopefully this time iron out all the bugs from the last implementation
2017-09-19 22:10:54 -07:00
greg
09d524c74a
Changing how parsing works again
...
Someone wrote a port of the LLVM kaleidoscope tutorial to rust, namely
https://github.com/jauhien/iron-kaleidoscope
I'm just gonna follow this along
2017-09-19 22:10:54 -07:00
greg
61c36c4def
Fix assign parsing
...
= is a keyword not an identifier
2017-09-19 22:10:54 -07:00
greg
bc4fbe4276
Start implementing definition
...
WIP, doesn't work
2017-09-19 22:10:54 -07:00
greg
fc11ee753d
Add block parsing
...
Right now evaluating a block reduces it to just the last AST in it, will
fix later with environments
2017-09-19 22:10:54 -07:00
greg
dd2b4893a4
Get rid of Separator token
...
Have separate newline and semicolon tokens
2017-09-19 22:10:54 -07:00
greg
51745fd800
Make convenience macro for parse errors
2017-09-19 22:10:54 -07:00
greg
8c0ac19fa8
Add full test
...
Test evaluate, tokenize, parser all at once
2017-09-19 22:10:54 -07:00
greg
971ab9ba21
Implement paren expressions
2017-09-19 22:10:54 -07:00
greg
819fb3f58f
Basic evaluator functionality
...
Interpreter now works for simple arithmetic expressions
2017-09-19 22:10:54 -07:00
greg
1c23329656
Add boilerplate for evaluation
...
Just wires everything up, doesn't actually evaluate yet
2017-09-19 22:10:54 -07:00
greg
6da20cbfaf
Address compiler warnings
2017-09-19 22:10:54 -07:00