- No semantic actions - parser constructs concrete parse trees
- No precedence declarations to resolve ambiguities
- Lexer+parser specified together, but all tokens still have to be enumerated
- Arbitrary Haskell expressions as semantic actions
- can construct abstract syntax trees (or whatever is desired)
- Lexer generated by a separate tool. All tokens have to be "imported"
- Supports precedence declarations