# Release 0.23
- perl -MTestML -e 'TestML->compile($file, $class)';
- TestML
  - %include
  - %extends
  - %require
- Make YAML Awesome
  - YAML Test Suite Driven
  - Consistent implementations
    - Single-sourced UniScript
  - Ruby leads the way

# Release 0.22
- Remove TestML dependency
  - Consolidate boot and testml tests
- More testing
  - Compilation units
  - Receiver results
  - Regex captures
  - Write tests for various ASTs
  - Write tests for skip wrap pass and flat
- Try stack based parser\
  - pop with pointer decrement
    - Analyze stack on errors
- Rewrite Pegex::BootStrap as tokenizing/shunting-yard
- Make suffixes and prefixes be universal
  - Add _ flatten prefix to language
- Work on Pegex::Input
- Pegex::pegex (2+ even args)
  - (input => $input_str_or_object)
  - (grammar => $grammar_class_or_object)
  - (grammar => $grammar_class_or_object, receiver => $receiver)
  - (..., debug => 1) # parse debug only
  - (..., debug => 2) # compile and parse debugging
  - (..., compile => 1) # precompile grammar
- Add inheritance and inclusion
  - Make sure that things are *lazy*
- More aggressively compile into modules
  - support compile options in grammar
    - optimize
    - min/max
- Support multiple data formats in make_tree
- Support single quoted token 'a + b = ...'
  - defines a literal regex with YAML single quote semantics
- Combinate adjacent regexes
- Support %SmartWhitespace
  - rulename ~: a '=' b
  - rulename: a /~<EQUAL>~/ b
- Consider replacing ~ with ,
- Support partial and multiple parses on a grammar
- Support parser delegation to another parser

# New feature ideas
- Compile to arrays only (optionally)
- Add $_ support
- $parser->reset (or ->close)
- Support EXPR precedence parsing grammar
- Support grammar class methods as rules
  - sub rule_indent { ... }
- Make atoms be an actual grammar
  - Subclassable, Includable
- Multiple rule definitions per statement
  - Allow multiline
- Support special <RULE> reference (literal rule name)
- Support include and inherit (extends)
  - Class/object resolution
- '::' commit syntax
- Support position moving syntax
  - -- ++ -2 +3 -x +x
- Support subparser using Input object and certain pos
  - Input object should track position
    - This way it can be handed off to another parse
- parse() method can be partial, rather than full
- parse() method can be passed an ending rule. EOS is default.
- grammar object can have code rules
- receiver classes completely control what is result
  - Move default actions from parser to receiver
- Add match stack to the error message
- Add common errors to the Pegex grammar
- Refactor compression testing
  - compression equivalence is not a goal
  - s/\n/;/g *is* a goal
- Pegex ->optimize (after combinate)
  - Combine consecutive .rgx
  - .all or .any of 1 elem => .rul
- Add a TIMER option
- Add benchmarks

# Error Reporting
- Detailed error reporting
- Add `error` msgs to pegex.pgx
- Report grammar class name
- Report the grammar name if present
- Report the current rule stack
- Report info from the Input object
- Report 'End Of Input' message instead of '><'

# Documentation
- Document each module
- doc subdir make docs

# Research
- Look at Perl6::Rules on CPAN
- Look at Regex::Grammars
- Look at Parse::RecDescent tests
- PPI parsing

# Other Parsers to write
- Indentation parser
  - Maybe indentation rules can be grammar methods
- Tracing/Debug Parser
  - Move debug stuff out of Pegex::Parser
  - Count calls
  - NYTProf
- Backtracking parser
  - Parse Name: First Middle? Last

# Other Receivers to write:
- Pegex::Receiver::Marpa

# Parser/Compilers to Write
- irssi.log parser
- Perl 5
- Perl 6
- CoffeeScript
- UniScript
- Kwim
- MarPeg

