FWIW, I'm developing a library based on the technique outlined in this paper (and others by Time Wagner). Like the original paper, it uses LR(1) (and GLR), not LL(k).
The library itself is here: https://github.com/tree-sitter/tree-sitter
and here are some existing grammars:
* https://github.com/tree-sitter/tree-sitter-javascript
* https://github.com/tree-sitter/tree-sitter-go
* https://github.com/tree-sitter/tree-sitter-ruby