[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