[antlr-interest] Previous rule element reference in a scope

The Researcher researcher0x00 at gmail.com
Thu Apr 14 08:34:30 PDT 2011


Graham,

I have a similar problem and scopes are working for me, but to do it I have
to build the trees with code and don't have the trees building correctly,
but do expect it to work.

My problem is that I have field definitions with names and also allow alias
names for my field definitions. So I have to duplicate the field defintion
less the name or alias names, then for each name or alias name build a new
field defintion with either the name or the alias name.

This is early development code, but hopefully this will give you some help.
If you can do it without creating the trees in code you will be better off.

fieldGroup
scope
{
 CommonTree info;
 CommonTree name;
 CommonTree alias;
}
@init
{
 $fieldGroup::info = null;
 $fieldGroup::name = null;
 $fieldGroup::alias = null;
}
//@after { Console.WriteLine("fieldGroup: " +
CommonTreeSuccour.ToStringTree((BaseTree)retval.Tree)); }
 : ^(FieldGroup fieldInfo fieldName generateFieldByName (fieldAlias
generateFieldByAlias)*)
  -> generateFieldByName generateFieldByAlias*
 ;

fieldInfo
@after
{ $fieldGroup::info = (CommonTree)retval.Tree; }
 : ^(FieldInfo fieldInfoItems*)
 ;

fieldName
@after
{ $fieldGroup::name = (CommonTree)retval.Tree; }
 : ^(FieldName Id)
 ;

generateFieldByName
scope
{
 CommonTree info;
}
@after
{
 retval.Tree = $generateFieldByName::info;
 //Console.WriteLine("generateFieldByName: " +
CommonTreeSuccour.ToStringTree((BaseTree)retval.Tree));
}
 :
 {
  $generateFieldByName::info =
(CommonTree)adaptor.DupTree($fieldGroup::info);
  $generateFieldByName::info.Children.Add($fieldGroup::name);
 }
 ;

fieldAlias
@after { $fieldGroup::alias = (CommonTree)retval.Tree; }
 :  ^(Alias qid)
  {
   $structDef::useLayoutOffset = true;
  }
 ;

generateFieldByAlias
scope
{
 CommonTree info;
}
@after
{
 retval.Tree = $generateFieldByAlias::info;
 //Console.WriteLine("generateFieldByAlias: " +
CommonTreeSuccour.ToStringTree((BaseTree)retval.Tree));
}
 :
 {
  $generateFieldByAlias::info =
(CommonTree)adaptor.DupTree($fieldGroup::info);
  $generateFieldByAlias::info.Children.Add($fieldGroup::alias);
 }
 ;


Eric


More information about the antlr-interest mailing list