[antlr-interest] Extending contexts in code (was "Appropriate use of honey badger listeners")
Terence Parr
parrt at cs.usfca.edu
Wed Jan 11 18:56:43 PST 2012
On Jan 11, 2012, at 6:54 PM, Sam Harwell wrote:
> To "dynamically add fields", add the following method for each rule foo:
>
> protected fooContext newContext_foo() { return new fooContext(); }
so then these are "factories" and we subclass parser to alter? What if we need multiple kinds of fooContext for different passes?
Ter
>
> If you keep the same implementation of labels, also add the following for a
> label #mult inside rule foo:
>
> protected multContext newContext_mult(fooContext originalContext) {
> multContext result = new multContext();
> result.copyFrom(originalContext);
> return result;
> }
>
> Now you can extend any context you want in code only. :)
>
> --
> Sam Harwell
> Owner, Lead Developer
> http://tunnelvisionlabs.com
>
>
> -----Original Message-----
> From: Terence Parr [mailto:parrt at cs.usfca.edu]
> Sent: Wednesday, January 11, 2012 6:40 PM
> To: ANTLR Interest Mailing List
> Subject: [antlr-interest] Appropriate use of honey badger listeners
>
> hi Kyle,
>
> I have 2 questions about the current listener mechanism:
>
> 1. How do we return values from listener methods so that we can do
> computations?
> 2. How do we alter a parse tree?
>
> For 2, I think we return a new tree as a return value and the parse tree
> walker will incorporate that into the tree if it sees a different tree come
> back. In other words, it will do something like this in the walker:
>
> newtree = listener.someEvent(oldtree);
> if ( newtree!=oldtree ) replace-oldtree-with-newtree;
>
> For 1, I don't have a great answer. To make this more concrete, imagine we
> have an expression rule and we want to use listener events to compute the
> value of an expression. So, instead of having actions in the grammar like:
>
> e returns [int v]
> : a=e '*' b=e {$v = $a.v * $b.v;}
>
> we would simply match it
>
> e : e '*' e -> mult .
>
> and then have listener events compute values. but where does of the listener
> object store the intermediate results of a subtree computation? Certainly we
> don't want to have to add "returns [int v]" to the grammar for every
> different paths we make over the parse tree. Without a return value from a
> listener event (which I want to use for tree rewriting), how do we get a
> value up the tree in a computation? We can't really use temporary fields of
> the listener object because it's hard to tell which value gets associated
> with which listener method. we would need a temporary fields to hold result
> values from each listener. actually, I'm not even sure that would work. We
> need to associate result values with sub tree roots (i.e. contexts). In
> other words, we need a way to dynamically add fields to contexts for the
> specific purpose of a particular parse tree walk. One can imagine that I
> have a pass for computing the type of expression and another pass for
> computing the value. In both cases, I need result values for each subtree
> (type and then value).
>
> Maybe that is just a hash table from ctx node to value;
> Map<ParserRuleContext, Object>. maybe. That presents a few issues for me
> because I use hashCode/equals in a weird way for use with grammar analysis,
> but that would be the idea.
>
> class MyGListener extends BlankGListener {
> Map<ParserRuleContext, Integer> results = .;
>
> public void exitRule(AParser.multContext ctx) { results.put(ctx,
> results.get(ctx.a) * results.get(ctx.b)); }
> public void exitRule(AParser.addContext ctx) { results.put(ctx,
> results.get(ctx.a) + results.get(ctx.b)); } }
>
> not very pretty in Java. Python would look better:
>
> results[ctx] = results[ctx.a] * results[ctx.b];
>
> This way we can associate any values we need to for any node, in effect,
> decorating the parse tree as needed.
>
> What do people think about the solution? is there a way I can automate some
> of this? I think that Python and Ruby would make short work of that because
> they allow dynamically adding fields (normally a horrible thing to do) ;) Is
> there a better way to do decorations in Java?
>
> Ter
>
> On Jan 11, 2012, at 1:49 PM, Kyle Ferrio wrote:
>
>> Excellent, congratulations and thank you.
>>
>> I just spent about half an hour playing with variations on A.g4 (since
>> it worked right out of the box I had to keep going...) and this is
>> really nice. This is the first time I've looked at the new-in-antlr
>> listener paradigm. I will need a while to fully appreciate the doors this
> opens.
>> Honey Badger makes things easy, so I want to stay on his (?) good side.
>>
>> Q: how do you tell a boy Honey Badger from a girl Honey Badger?
>>
>> A: you don't. they're both bad-ass.
>
> nice!
>
> Ter
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe:
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
More information about the antlr-interest
mailing list