[antlr-interest] Usage of scopes in v3

Terence Parr parrt at cs.usfca.edu
Sun Oct 22 12:36:11 PDT 2006


On Oct 21, 2006, at 2:42 AM, Kay Roepke wrote:

> Hi Ter,*!
>
> I have played around with dynamic rule scopes over the last week or  
> so and was wondering what the current best-practice was.
> If you consider the symtab example for v3 below, I was wondering  
> how you would go ahead in an implementation of a symbol table while  
> using scopes.

What are you trying to do in the finally?  It will just pop off and  
go away after the method unless it's saved; a finally would do that.

Crap. the stuff is popped BEFORE the finally action.  Hmm...that  
doesn't seem right, does it?

Ter

>
> A naïve approach would be the @finally action below, which fails  
> because right before the comment the current Symbol scope would be  
> popped from the block. You would naturally need to access the  
> Symbol scope to enter its entries into your program's symbol table  
> which would not go away when the rule exits. The obvious solution  
> is to add an action to the end of the rule block to do the  
> transition so it doesn't execute when the rule fails.
> Is this actually the recommended way or is there something I  
> overlook? The downside with the @finally route is of course that it  
> gets executed regardless whether the rule failed or not, so you'd  
> have to guard against that manually. Same goes for backtracking.
>
> cheers,
> -k
>
> grammar SymtabTestParser;
>
> /* Scope of symbol names.  Both globals and block rules need to  
> push a new
> * symbol table upon entry and they must use the same stack.  So, I  
> must
> * define a global scope and say that globals and block use this by  
> saying
> * 'scope Symbols;' in those rule definitions.
> */
> scope Symbols {
>   List names;
> }
> [...]
> block
> scope Symbols;
> @init {
>     level++;
>     $Symbols::names = new ArrayList();
> }
> @finally {
>         // is $Symbols::names still valid here?
> }
>     :   '{' (decl)* (stat)* '}'
>         {
>         System.out.println("level "+level+" symbols: "+ 
> $Symbols::names);
>         level--;
>         }
>     ;
> [...]
>
>
> -- 
> Kay Röpke <kroepke at classdump.org>
> classdump Software
> Key fingerprint = A849 0F2C C322 4022 379E  8661 7E1B FE0D 4CD2 A6D0
>
>
>



More information about the antlr-interest mailing list