This looks great Jeff!
I'll definitely be using some of the wiki info in my project. Here's a couple thoughts:
1. I don't totally understand why you have have these methods empty:
public void addChangeListener(ChangeListener changeListener) {}
public void removeChangeListener(ChangeListener changeListener) {}
Does this have to do with ANTLR not being an incremental parser generator, or is this totally unrelated? All the documentation for the API says about these methods (posted here):
http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-parsing-api/org/netbeans/modules/parsing/spi/Parser.html
for this method is "Registers new listener," which doesn't help very much. If you know something more it might be good to post info about it.
2. There's another way of doing error handling of syntax errors in ANTLR. The way Terrence Par talks about it in his book is to define an @rule catch block, which looks like this:
@rulecatch {
catch(RecognitionException re) {
}
}
What I usually do for projects like this (for good or ill), is to 1) create some general abstractions (e.g., compiler error manager classes), 2) catch all of the errors ANTLR outputs and send them to the abstractions. This usually makes it a bit easier to manage the errors, especially if you are implementing further stages in a compiler/virtual machine architecture. Anyway, that's all probably too much for your tutorial, but I thought I'd mention @rulecatch as an alternative error handling mechanism in case you'd never heard of it.
Great tutorial and thanks for posting it! If you aren't on the ANTLR mailing list, I can cross post it there. I image there's some folks there that would be interested in this as well.
Andreas