comp.lang.ada
 help / color / mirror / Atom feed
From: Charly <carl.weierstrass@googlemail.com>
Subject: Re: question about the usage of opentoken-4.0b
Date: Wed, 25 Apr 2012 12:27:54 -0700 (PDT)
Date: 2012-04-25T12:27:54-07:00	[thread overview]
Message-ID: <22414713.827.1335382074386.JavaMail.geo-discussion-forums@vbbcc6> (raw)
In-Reply-To: <82r4vcf26o.fsf@stephe-leake.org>

Am Mittwoch, 25. April 2012 14:03:59 UTC+2 schrieb Stephen Leake:
> Charly writes:
> 
> > Hi,
> >
> > I have a question about the usage of opentoken-4.0b, a scanner/parser-library written in Ada.
> > So my question isn't about the language Ada itself but only about this library.
> >
> > I define a Grammar starting with 
> >
> >    Grammar : constant Production_List.Instance :=
> >      Prog      <= Def_List & EOF + Program_Token.Create     and
> >      Def_List  <= Def_List & Ent + Element_List.Concat      and
> >      Def_List  <= Ent            + Element_List.Create      and
> >      Ent       <= Entity_Key & Ident & Colon & El_List & End_Key &
> >                   Semicolon      + Entity_Token.Create      and
> > ...
> >
> > and I create and call the parser with 
> >
> >    Text_Parser := LALR_Parser.Generate (Grammar, Analyzer, False);
> >
> >    LALR_Parser.Parse (Text_Parser);
> >
> > It works fine, but to use the result of the parsing, which happens to
> > be the start element 'Prog' of the above Grammar, I had to store it in
> > a global variable, as one of the actions of the procedure
> > 'Program_Token.Create'. But I would like to avoid this, because I
> > don't like global variables;
> >
> > The variable 'Prog' in the Grammar definition has the right type, but
> > does not contain any data, as I expected.
> >
> > Any help would be appreciated.
> 
> I think I understand; you want the side-effect output of
> Program_Token.Create for Prog to be stored in some non-global variable.
> 
Yes, thats right.

> I'll assume that by 'global' here you mean 'declared in some package,
> and thus allocated statically' as opposed to 'declared in some
> subroutine, and thus allocated dynamically'.
> 
Yes, right again. My working solution - that I don't like - stores it in the 
Program_Token package.

> You want dynamic allocation (either stack or heap, but with the heap
> root reference on the stack) for the side-effect output.
> 
> I've never tried to do that; I always have a few root global variables
> in my most complex code (_something_ has to store the symbol table :),
> so it has not come up.
> 
> The examples in OpenToken essentially do all processing inside the
> various action subroutines, so they don't help here.
> 
I could not find the answer in the docu. Of cource I could do all
processing in the final Program_Token.Create procedure, but I would
like to do it in the main program after the call of LALR_Parser.Parse(...),
something like
Result := LALR_Parser.Get_Result, 
that returns the Instance defined in Program_Token. This Instance contains
all the stuff collected while parsing the input file.

> If you could post a small compilable example, I'd be able to think about
> it more concretely. You might get somewhere with access discriminants,
> but I don't see how immediately.


My program consists of about 15 packages, so I will try do create a trivial
working example and post it again.

> 
> -- 
> -- Stephe

Thanks for your answer.

Charly




  reply	other threads:[~2012-04-25 19:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-24 19:01 question about the usage of opentoken-4.0b Charly
2012-04-25 12:03 ` Stephen Leake
2012-04-25 19:27   ` Charly [this message]
2012-04-25 12:58 ` Marc C
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox