Well, I figured this out owing to some arcane link on the web, and I *really* wish this was better documented in
https://github.com/antlr/antlr4/blob/4.6/doc/javascript-target.md where I expected to find it.
Specifically, two salient points:
(a) First, you have to overload the prototypes for each exit function (the original exit functions all appear in the generated *Listener.js, so grep for them to overload them) for each parsed value in your main program which is really your application that uses the parser, and
(b) In the overloaded function, ctx.getText () gives you the text that was parsed. Actually, if you need to know what other methods are available to operate on the ctx object, you are to find it in the Java docs [sic] for the JavaScript method names.
Here's an example (note the various exit methods for Simple.g4, this one is exitParam):
SimplePrinter.prototype.exitParam = function (ctx) {
console.log ("Param name is " " ctx.getText ());
Of course, instead of printing them, you can do various other things with them now that they are parsed. Now, when the line
antlr4.tree.ParseTreeWalker.DEFAULT.walk (printer, tree);
is executed, each lexeme as parsed is printed (or processed, per your overloaded exit functions).
I might either propose a pull request for antlr4 on github or write a blog as this is likely going to be useful for others.