Feature | RecDescent | Yacc | PCCTS | Hand made |
Regular expressions as terminals | Y | Y | Y | sometimes |
Parse-time interpolated literal terminals | Y | N | N | N |
Context sensitive lexing | Y | hard | hard | sometimes |
Tunable token separators | Y | hard | hard | N |
Requires separate tokenizer | N | Y | Y | sometimes |
Noncontiguous productions | Y | N | N | n/a |
Subrule quantifiers (repetitions, optionals) | Y | N | Y | n/a |
Non-greedy quantifiers | coming | N | N | n/a |
Inlined subproductions | Y | N | N | n/a |
Subrule arguments | Y | N | Y | rarely |
User-defined lexical variables in subrules | Y | N | Y | often |
Stubbing of missing subrules | Y | N | N | n/a |
Positive and negative lookahead rules | Y | N | N | rarely |
Data driven subrule selection(<matchrule>) | Y | N | N | rarely |
Subrule templates | Y | N | N | N |
Embedded actions | Y | Y | Y | Y |
Deferred embedded actions | Y | N | N | rarely |
Tunable default embedded actions | Y | N | N | N |
Line and position information in actions | Y | poor | Y | some |
Automated error messages | Y | poor | some | N |
Conditional error messages | Y | N | N | N |
Tree pruning and unpruning (commit/uncommit) | Y | N | N | sometimes |
Run-time modification of parser | Y | N | N | rarely |
Regex-based resync after fail | Y | N | N | N |
Object oriented parser | Y | some | Y | sometimes |
Parsing directly from an input stream | N | Y | Y | sometimes |
Multiple start rules | Y | N | N | rarely |
Implementation language | Perl | C | C++ | various |
Parsing model | LL(k) (recursive) | LALR(1) (table) | LL(k) (table) | various |
Generates run-time parsers | Y | N | N | n/a |
Generates compile-time parser code | coming | Y | Y | n/a |
Fast | coming | Y | Y | Y |
Handles left recursion | N | Y | Y | sometimes |