[antlr-interest] Can "returns" return an aggregate?

Jim Idle jimi at temporal-wave.com
Sun May 30 15:07:17 PDT 2010


Look a the documentation for @sections - there are different ones so you can include before, after the .h or before or after antlr.h and so on. Also look at how I put together the header files in my examples. Basicalyl I have one .h file that everything includes.

Jim

> -----Original Message-----
> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> bounces at antlr.org] On Behalf Of Bob
> Sent: Sunday, May 30, 2010 10:00 AM
> To: antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Can "returns" return an aggregate?
> 
> My target is "C" (wish it was "C++") and because I'm accustomed to
> byson's
> stack items being a user-definable union, e.g.:
> 
> 
> 
>   %union {                                                   <-------
> declares a union of all rule return types
>     void*	node;
>     struct ModuleHeader moduleHeader;
>   }
> 
>   %type	<moduleHeader>	module_ansi_header                 <-----
> - declares
> return type of the specific rule
> 
>   module_ansi_header
> 	: TokModule { struct ModuleHeader _mh; $$ = _mh; }   <------ rule
> returns a ModuleHeader struct on stack
> 
> 
> 
> it was natural for me to think I could do something similar in Antlar,
> like
> this:
> 
>   @members
>   {
>    struct ModuleHeader { void* a; void* b };
>   }
> 
> 
>   module_ansi_header returns [struct ModuleHeader rslt]
>   scope {
>    struct ModuleHeader mh;
>   }
>     : TokModule { $rslt = mh; }
> 
> 
> 
> Which does not work. So I altered the rule:
> 
> 
>   module_ansi_header returns [void* a,void* b]
>   scope {
>    struct ModuleHeader mh;
>   }
>     : TokModule { $a = mh.a; $b = mh.b; }
> 
> 
> 
> My problem is `ModuleHeader` is undefined in "xxParser.h" because the
> inclusion order is incorrect:
> 
>   xxParser.c:
> 
>    #include "xxParser.h"                 <-------- typedef for rule
> return
> type refers to not-yet-defined `ModuleHeader`
>        .....
>    struct ModuleHeader { void* a; void* b };  <--- placement of
> @members
> block
> 
> 
> Being inexperienced with Antlr, I'm thinking I've just missed something
> simple.
> 
> Is there a way to get the "@members" block emitted prior to the
> inclusion of
> the "xxParser.h" file?
> 
> Thanks,
> Bob
> 
> 
> -----Original Message-----
> From: antlr-interest-bounces at antlr.org
> [mailto:antlr-interest-bounces at antlr.org] On Behalf Of Jim Idle
> Sent: Saturday, May 29, 2010 3:19 PM
> To: antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Can "returns" return an aggregate?
> 
> You might have more success if you said what target you were using :-)
> Also
> remember antlr.markmail.com.
> 
> The generated routines already return a struct, so you cannot put a
> struct
> in that struct. You need to return a pointer to a struct.
> 
> Jim
> 
> > -----Original Message-----
> > From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> > bounces at antlr.org] On Behalf Of Bob
> > Sent: Friday, May 28, 2010 5:06 PM
> > To: antlr-interest at antlr.org
> > Subject: [antlr-interest] Can "returns" return an aggregate?
> >
> > Is there a way to return an aggregate ?
> >
> >
> >
> > struct A { int m; double n; };
> >
> > extern struct A foo(void);
> >
> >
> >
> > myrule returns [struct A a]
> >
> >     : X
> >
> >      { $a = foo(); }
> >
> >   ;
> >
> >
> > 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
> 
> 
> 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