comp.lang.ada
 help / color / mirror / Atom feed
From: "Samuel T. Harris" <u61783@gsde.hou.us.ray.com>
Subject: Re: ASIS-FOR-GNAT, anyone?
Date: Thu, 09 Aug 2001 10:14:03 -0500
Date: 2001-08-09T10:14:03-05:00	[thread overview]
Message-ID: <3B72A8BB.1B4F0015@gsde.hou.us.ray.com> (raw)
In-Reply-To: 3B713442.80F2DCE3@yahoo.com

Lance wrote:
> 
> I've just been assigned a new project at work dealing with ASIS.  Not
> knowing Ada to begin with has made this quite a challenge.  I was
> wondering if someone could help with what seems like an easy thing to
> do.
> 
> Say I wanted to count all of the assignment statements in a compilation
> unit.  Assume also that I wanted to print out the name of each
> subprogram or block in which the assignment statement resides.  I cannot
> seem to find an ASIS function that would allow me to get to this
> information.  I devised my own crude way of doing it but there must be a
> simple solution that I am overlooking.
> 
> Thanks for your help in advance.
> 
> This is an example of what I am talking about:
> 
> procedure Red is
>   A : Integer;
> 
>   procedure Blue is
>     B: Integer;
>     begin
>       B := 2;
>     end Blue;
> 
>   begin
>     A := 1;
>   end Red;
> 
> -----------
> 
> Now, let stmt1 be "B := 2" and stmt2 be "A := 1".  My function would
> return:
> 
> Subprogram_Name ( stmt1 ) = "Blue"
> Subprogram_Name ( stmt2 ) = "Red"

My own experience up to now has been ASIS version 1 for Ada 83.
I know there are some differences with ASIS for Ada 95, but I
hope my comments will get you on the right road.

You want to use asis.elements.traverse, a generic, in which
you define you own routine which is called on each element
in the semantic tree.

This routine will have a case statement on the asis.elements.element_kind
where you are concerned with a_statement where you need another case
statement on asis.statements.kind where you are concerned with
an assignment statement.

As an optimization, you can safely use abandon_children
as the control when you see your assignment statement
since nothing within is of interest to your problem.

Having found an assignment statment, you are may be interested
in the following ...

Using asis.text.element_span to show where in the code
the assignment statment resides.

Incrementing your counter.

Using a loop on asis.elements.enclosing_element to "unwrap"
the element noting any subprogram or package structures
you find on the way to a asis.elements.nil_element (meaning
you have unwrapped outside the compilation unit itself
and can terminate the loop).

I hope these references are not too different in ASIS for Ada 95
and I hope they are helpful in pointing you into the right
directions.

-- 
Samuel T. Harris, Senior Software Engineer II
Raytheon, Aerospace Engineering Services
"If you can make it, We can fake it!"



      parent reply	other threads:[~2001-08-09 15:14 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-08-08 12:44 ASIS-FOR-GNAT, anyone? Lance
2001-08-08 17:08 ` Jean-Pierre Rosen
2001-08-09 15:14 ` Samuel T. Harris [this message]
replies disabled

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