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