2 This is a list of things I definitely want to do. I don't go into too many
3 specifics, because the specifics change often as I think about the problem
6 * What about GLAs with EOF out of the start state? If there is only one
7 non-EOF transition, it *seems* pointless, because our normal EOF stack
8 unwinding seems to cover it. On the other hand, verifying this is always
9 true seems like a lot of hard thought. Let's think of it as an optimization
13 * make semicolons optional at end of line.
15 Compiler / Grammar Analysis (all changes should have test-cases):
16 * make tostring() methods for all of the grammar objects.
17 * create Lua bindings for the C grammar representation, which we can use
18 to write tests that verify that the grammar makes it through the bytecode
20 * (maybe) take regular subset of non-regular lookahead when it doesn't
21 cause alternatives' languages to intersect.
22 * (maybe) support full-LL by having first states of GLA have edges that
23 are the states on the return stack at runtime.
24 * detect cases where some RTN alternatives have no GLA final state.
25 (shouldn't happen, modulo bugs).
26 * deal with lexer-level ambiguity. longest match will do for now, but
27 we're not currently detecting s -> "A" | "AB";
30 * Richer callback specifiers.
31 * Bring back slotbufs: a cheap (stack only, no heap) way of saving parse_vals for
32 the currently-open nodes of the parse tree.
33 * Provide a buffering layer.
34 * As the runtime starts to mature: language bindings.
36 Tests! Everything should have tests, as much as possible:
37 * all aspects of compilation
38 * bitcode format (both reading and writing)
39 * JSON output from gzlparse. Both well-formedness and accuracy.
41 Major design areas that exist only in my head:
42 * Character sets other than ASCII.
43 * Embedding Lua to do things only an imperative language can do.
44 * Operator-precedence parsing using the shunting yard algorithm.
45 * Parallel parsers (for both embedded languages and things like whitespace/comments)
46 * Error recovery (basically: just yield to an imperative function).
47 * Generate imperative bytecode / JIT compile.