| 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 |