[antlr-interest] anybody using dynamic scopes?

Iztok Kavkler iztok.kavkler at fmf.uni-lj.si
Wed Feb 10 10:07:49 PST 2010


I use it for error reporting from a compiler: during tree parsing phase 
I call several functions that may throw CompileError, which needs 
information about current node's line and column. Since I don't want to 
pass the current node as a parameter to all of these functions I have 
created a scope

scope InfoScope {
     CommonTree node;
}

There is some extra work involved, since I have to say

scope InfoScope;
$InfoScope::node = $rule.start;

at the beginning of every rule.

Then again, perhaps there is an easier way to do this?

Iztok


On 10.2.2010 2:30, Terence Parr wrote:
> Hi,
>
> Is anybody using scopes?  E.g., here is the use C grammar:
>
> scope Symbols {
>          Set types; // only track types in order to get parser working
> }
>
> Every rule that declares its usage of Symbols pushes a new copy on the stack effectively creating a new symbol scope.
>
> translation_unit
> scope Symbols; // entire file is a scope
> @init {
>    $Symbols::types = new HashSet();
> }
>      : external_declaration+
>      ;
>
>
> Then rule declaration declares a rule scope that lets any invoked rule see isTypedef boolean.  It's much easier than passing that info down as parameters:
>
> declaration
> scope {
>    boolean isTypedef;
> }
> @init {
>    $declaration::isTypedef = false;
> }
>      : 'typedef' declaration_specifiers? {$declaration::isTypedef=true;}
>        init_declarator_list ';' // special case, looking for typedef
>      | declaration_specifiers init_declarator_list? ';'
>      ;
>
>
> Rule direct_declarator can then easily determine whether the IDENTIFIER
> should be declared as a type name.
>
> direct_declarator
>      :   (   IDENTIFIER
>              {
>              if ($declaration.size()>0&&$declaration::isTypedef) {
>                  $Symbols::types.add($IDENTIFIER.text);
>                  System.out.println("define type "+$IDENTIFIER.text);
>              }
>              }
>          |   '(' declarator ')'
>          )
>          declarator_suffix*
>      ;
>
> Trying to decide if it's worth reimplementing for v4.
>
> Ter
>
> 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