I started transforming my old notes into a proper documentation.
Profiling showed that the parser spends a lot of time comparing Bindings objects. I implemented a Copy-On-Write optimization to make these comparisons faster.
I profiled the REPL. This revealed that two methods of the Value class get the types map by value. This unnecessarily copying is a significant overhead. Now they get it by reference.
I added an if-else expression. Unfortunately, being an expression, it interacts with infix expressions and introduces ambiguity in the grammar. The next step is to fix improve the grammar for all expressions to eliminate this ambiguity.
I refactored the REPL grammar so that all expressions have priority.
I added support for epsilon to several of the marchers. I also added a primitive Print matcher for debugging purposes.
I added infix operators for comparison and registered functions for them that compare integers.
I added to the grammar the notion of "safe" and "unsafe" separators and this allowed me to accept multi-line statements when they are unambiguous.
I expressed the assignment grammar with the new generic infix operators grammar. I needed to add an associativity parameter to the opName non-terminal to support a mixture of left-associative and right-associative grammar rules.
I've rewritten the grammar for infix expressions to make it easy to add new infix expressions. Now all it takes is to add a single production rule, which declares the precedence of the new operator, its symbol and its constructor function. To achieve this, I had to add a few minor features to the parser - an Epsilon matcher, a Bind which doesn't consume input, and a Construct which calls a function bound to a symbol.
+1
Updated the make file and infix.cpp to make the repl build eith clang too.
I started refactoring the REPL code. I started by moving it to a separate directory. Then I extracted the arithmetic infix operations into a separate file. As a result I temporarily introduced an ambiguity between them and the assignment operator.
Instead of the "continuation passing style" which I started with the previous commit, I implemented "non-local-returns", which are more limited but simpler to use. I also changed eval functions to take the environment as a shared_ptr in anticipation of let expressions and the like.
I'm moving eval functions to continuation passing style.
I forgot to add core/eval.cpp in my last commit
I added to the evaluator support for error prop...
I transformed quote into a proper type and move...
I added functions to register and lookup functi...
I added Tower types for variable assignment/bin...
I fixed the type-punned pointer compilation err...
I added support to type objects for registering...
I restored evaluation support for all types of ...
I added to the parser support for passing liter...
I added a tag parameter to the expression non-t...
I added a bool type. It's grammar rules cause a...
Now that the parser is split into a header file...
I added a conditional matcher which is applied ...
Fix some include paths
I split the string.h file, which defines a stri...
I added a makefile and split tests.cpp into sev...
I split the parser.h file into a .cpp file and ...
I added a trivial string table class and two te...
I added variable binding and variable lookup as...
I added to the REPL grammar and printing for st...
I added to the Char matcher support for charact...
I added a type object for the string type, and ...
I added support for epsilon to the parser, and ...
I added to the REPL a quote operator.
I added printing for quote expression. This all...
I identified the bug - the comparisson in Value...
The previous commit missed a newly added file f...
I'm checking in some code that doesn't work wit...
I disabled the part of the parser tracing which...
I added grammar rules for infix integer express...
I added grammar to convert numbers to int value...
I improved the REPL grammar to ignore whitespac...
I added an interface for types and used it to a...
I replaced the tokenizer in the REPL with the n...
Merge branch 'Parser'
Merge Parser into the main branch.
Merge branch 'master' into Parser
Documented and cleaned up all matcher classes a...
Merge branch 'Parser' into master
Corrected some typos and spelling mistakes.
I cleaned up the Parser class and added documen...
Some more documentation and cleanup.
I updated the file comment. It now provides a c...
I fixed the Rep matcher. It now takes into acco...
I refactored the NT matcher. I also identified ...
I added a parser test case for left recursion. ...
I added a few tests, including one that fails. ...
The failing test fails for two reasons. I fixed...
I changed the implementation of tail calls. The...
I've added a few minor improvements in the outp...
I added tracing messages to the parser to displ...
I fixed the expected value of the left recursio...
I added a test case for the NT matcher and fixe...
I implemented support for parametrized construc...
I renamed several methods of the Parser class t...
I implemented unification for the Str matcher.
I moved the Argument class out of the Invocatio...
I transformed Parser::Bindings from a typedef t...
I simplified the implementation of Optional and...
I changed the interface of SymbolTable::Lookup(...
I added an Optional class and a small part of t...
I added an alternatives matcher test and I impl...
I reenabled the simple constructor test and rei...
I reenabled the Rep() test cases. As I couldn't...
I reenabled the Seq matcher test and implemente...
I reimplemented the parser using continuation p...
I added a Char matcher and a parametrized non-t...
This code doesn't work yet. I started the parse...
Added a repetitions matcher. Slightly refactore...
Removed executable files which I added accident...
Added primitive support for functions in the fo...
Fixed an unused variable error, which was repor...
I fixed a bug in the sequence matcher and I add...
The parser finally produces a parsed data objec...
Now the parser returns a boolean result to indi...
Dropped the previous parser classes and impleme...
Rebased Parser branch to pick up the type check...
I added primitive support for types in the form...
Added classes for non-terminals and terminals.
Started work on the parser. Nothing works yet.
By default, gzip ignores the stored file name when extracting gz archives. However,...
Added a few unit tests for the Value type.
I extracted the SymbolTable::BoundValue class i...
I refactored the unit tests a bit. I laso added...
I extracted the TokenType class into a Symbol c...