Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I'd be interested see pointers to ANTLR-based languages people are developing. I found it to be a powerful tool, but also limiting.

As far as I know, ANTLR v4 is even more of a "framework" than v3, in that it dictates your program structure and always outputs a full parse tree. It appears to have lost the ability to verify the value of k for LL(k) grammars, due to a more powerful underlying algorithm.

I think that simplifies it for most use cases but makes others hard or impossible.



I work on implementing languages and I often need new parsers. Either for full languages or little embedded languages or expression syntaxes of various kinds.

I often think 'right, this time I'm going to write a really nice little Antlr grammar and do it properly'. But every single time I regret it because there's always some complexity that means things don't fit into the Antlr model, and making things work the way Antlr works means more complexity than just writing a simple lexer and parser by hand.

My most recent example is that Ruby strings can't always be safely converted into Java strings, but Antlr wants to parse Java strings only and not a byte[]. So I had to copy my Ruby byte[] into a Java string a character at a time and just use the character as numbers pretending that they had no encoding.

That's just one example. It's always some other new problem that means it's more ceremony to use Antlr than the tool saves me later one.

Despite lexing and parsing being an entire sub-field of computer science, to be honest I'm not sure that in practice lexing and parsing are really problems that are so complex in the first place that a tool is ever needed.


Agree here. I recently implemented a small query language DSL uaing Antlr and I regret not writing my own lexer and parser. It's difficult to bend a framework like Antlr into a useable state if you hit an edge case or require unusual look ahead semantics.

Next time, I'll start with a simple recursive descent parser.


I have this "meta-language" rant brewing for my blog[1], and I feel like you took the words out of my mouth!

Are you saying that ANTLR makes some unwarranted assumptions about Unicode? Does that just depend on the generated Java code, and would it be different for generated parsers in C++? I don't know the JVM very well, but my understanding was that the JVM makes some Unicode assumptions that aren't always appropriate.

The last "rant" was here, about meta-languages only being suitable for toys: https://news.ycombinator.com/item?id=13040682

vidarh also responds with his problems parsing Ruby (a "real" language): http://hokstad.com/compiler

The blog is based on my experience in writing a parser for bash. I ported the POSIX shell grammar to ANTLR, but it fell ridiculously short of being a production quality parser.

I believe it's essentially impossible to write a bash parser with ANTLR. But I don't hear about any alternatives. All I heard is yacc/bison for bottom up parsers, and ANTLR for top-down. Shell needs a top-down parser because it's an interactive language (the PS2 prompt) and for completion. But it doesn't appear there is any other "serious" meta-language for top-down parsers other than ANTLR? It certainly is the best documented and longest-lived, but I am surprised how far short it falls for many tasks.

Part of the rant will be a survey of "real" language parsers (i.e. take the top 20 TIOBE language implementations) and see that they almost all use hand-written parsers, or bespoke parser generators. For example, Python has its own top-down parser generator in the tree, pgen.c.

[1] http://www.oilshell.org/blog/2016/11/20.html


> it doesn't appear there is any other "serious" meta-language for top-down parsers other than ANTLR?

Have you explored Perl 6 and its Rules sub-language and engine?[1] The Rakudo Perl 6 compiler is written in Perl 6 using Rules.[2]

[1] https://en.wikipedia.org/wiki/Perl_6_rules

[2] https://github.com/rakudo/rakudo/blob/nom/src/Perl6/Grammar.....


I have heard of this feature of Perl 6, but not used it. One obvious difference is that ANTLR is language-agnostic in that you can generate parsers in C++ or Python too, while I assume Perl 6 doesn't have that functionality. So that limits its appeal.

(Although honestly ANTLR is pretty skewed towards Java; the generated code is kind of like Java-in-Python or Java-in-C++.)

I'm curious what algorithm Perl uses to match grammars. ANTLR uses a few algorithms, like the one to generate lookahead tables for LL(k), and then the LL() algorithm, and apparently a new one with ALL() in ANTLR v4.


To be fair to ANTLR I think it might have actually wanted a CharSequence, which is a bit more pragmatic, and I could probably have wrapped my byte[] in an object implementing that interface.

The real problem I should mentioned was that I seemed to be using very little of the real ANTLR parsing algorithm, as there was so much logic in actions to parse a real language like Ruby. These languages aren't designed with a formal grammar model in mind. They just do what they do and it's your problem if ANTLR isn't designed for what they want.

Actions are the grammar equivalent of unsafe blocks in languages like Rust or Haskell. If you are using them in an application it's a red flag, and I never managed to write an ANTLR grammar without them. That then makes the red flag on ANTLR, not on my programming skills.


This is exactly the sort of thing I was looking for. I keep on thinking that my life would be easier if I just adopted something like ANTLR, but every time I look into it it looks like it's more work than it's worth.

Good to hear that this has been a similar experience to people who have actually gone and actually used ANTLR.


I needed to parse a tiny subset of SQL. I did it with ANTLR very quickly. It would take much more time doing it by hand, and I know quite a bit about parsing. For complex language it might be the other way, of course. Actually I never saw a single real programming language without hand-crafted parser. But if you need a tiny DSL, ANTLR is fine.


The query language for Riemann uses a parser made with ANTLR. ANTLR has many compile targets, so it was reasonably easy to port the parser from Clojure to Nodejs.

https://github.com/riemann/riemann/blob/master/resources/que...

https://github.com/nextorigin/riemann-query-parser/blob/mast...

I'm using it with Godot2, a Riemann-like streaming monitoring system in Nodejs.

https://github.com/nextorigin/godot2-dash




Consider applying for YC's Fall 2026 batch! Applications are open till July 27.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: