[antlr-interest] This should be easy - but I can't figure it out

Voelkel, Andy andy.voelkel at plantronics.com
Tue Nov 15 21:02:56 PST 2011


See replies below starting with [Andy - ...

- Andy


> Hi,
>
> I keep running into questions like this, and don't know how to answer them. Could anyone look at this simple example and tell me how I would accomplish my goal? I think I've got a central concept mixed up in my head.
>
> What I'm trying to do is under the "array" rule below, where I'm trying to create a rewrite rule which collects elements which are within a grouping construct. This seems to come up a lot for me, and I don't get how to do it.
>
>
> Thanks for any help! Here's the grammar excerpt:
>
> tokens { ARRAY; }
>
> @header { using System; }
>
> public prog:   ( stat {Console.WriteLine(
>                 $stat.tree==null?"null":$stat.tree.ToStringTree());} )+ ;
>
> stat:   assign | block | ';'! ;
> block:  ID^ ID '{'! (assign)+ '}'! ;
> assign: ID '='^ (atom | array) ';'! ;
> atom:   FLOAT | ID | STRING ;
> array:  '[' ((FLOAT)+ | (STRING)+) ']' -> ^(ARRAY _FLOATS_OR_STRINGS_ ) ;

generally, any time you have a cardinality meta-operator (the ? * or +)
in the syntax portion of a rule, you will want a similar cardinality
operator in the re-write portion of that rule.

thus a first try at a re-write rule is:

array: '[' FLOAT+ | STRING+ ']' -> ^(ARRAY FLOAT+ STRING+) ;

the separate lists on the right of the -> work because your syntax
specifies separate lists.

[Andy - this approach doesn't work - I get exceptions thrown. I haven't debugged that yet.]

and i guess this first try really reduces to this rule:

array : '['^ FLOAT+ | STRING+ ']'! ;

[Andy - Not really. I did that first and it works. What I was trying to do in my example
Was use a new token type called ARRAY as the node type, not '[', which seems ugly]


note that you can use the += operator to accumulate lists of things. but
these lists are homogeneous (e.g. all of the elements in the list must
be of the same type).

and in this specific case both of your lists are lists of Tokens, so a
second try at a re-write rule is:

array: '[' (t+=FLOAT)+ | (t+=STRING)+ ']' -> ^(ARRAY $t+) ;

[Andy - that doesn't work either. I don't get exceptions, but I get errors and non-sensical output]


to me both of the above are not good choices because information that
the parser immediately has about the type of the elements in the array
is not explicitly placed into the tree.

so i would have 2 imaginary tokens ARRAY_FLOAT and ARRAY_STRING and use
this rule:

array
    : ( l='[' (f+=FLOAT)+  ']' -> ^(ARRAY_FLOAT ["FLT ARY",$l] $f+) )
    | ( l='[' (s+=STRING)+ ']' -> ^(ARRAY_STRING["STR ARY",$l] $s+) )
  ;

[Andy - This causes compiler errors, and I'm really not sure what you are getting at. But
I can adapt your basic idea to this, which is simpler and works:

array
    : ( '[' (FLOAT)+  ']' -> ^(ARRAY_FLOAT FLOAT+) )
    | ( '[' (STRING)+ ']' -> ^(ARRAY_STRING STRING+) )

It is similar to an example in Terence's book. It isn't really what I wanted to do. Maybe it is a
better idea, I'll need to think about that. But it still doesn't answer the question as to
how to get the result I originally wanted. I'm still curious about that.]

i think this last form will simplify subsequent processing of the tree.
note also the proper initialization of the imaginary tokens.

[Andy - what do you mean "proper initialization of the imaginary tokens"]



________________________________

CONFIDENTIALITY NOTICE: This e-mail transmission, and any documents, files or previous e-mail messages attached to it, may contain information that is confidential and/or legally privileged. If you are not the intended recipient, or a person responsible for delivering it to the intended recipient, please DO NOT disclose the contents to another person, store or copy the information in any medium, or use any of the information contained in or attached to this transmission for any purpose. If you have received this transmission in error, please immediately notify the sender by reply email or at privacy at plantronics.com, and destroy the original transmission and its attachments without reading or saving in any manner.

For further information about Plantronics - the Company, its products, brands, partners, please visit our website www.plantronics.com.


More information about the antlr-interest mailing list