From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,81e1a32ac1a2cfbd X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2001-08-14 15:11:38 PST Path: archiver1.google.com!newsfeed.google.com!newsfeed.stanford.edu!canoe.uoregon.edu!logbridge.uoregon.edu!titan03.ksc.nasa.gov!niven.ksc.nasa.gov!usenet From: "Samuel T. Harris" Newsgroups: comp.lang.ada Subject: Re: ASIS-FOR-GNAT, anyone? Date: Thu, 09 Aug 2001 10:14:03 -0500 Organization: Raytheon Aerospace Engineering Services Message-ID: <3B72A8BB.1B4F0015@gsde.hou.us.ray.com> References: <3B713442.80F2DCE3@yahoo.com> Reply-To: samuel_t_harris@raytheon.com NNTP-Posting-Host: sstf-fw.jsc.nasa.gov Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 4.7 [en] (X11; U; IRIX64 6.2 IP19) X-Accept-Language: en Xref: archiver1.google.com comp.lang.ada:11940 Date: 2001-08-09T10:14:03-05:00 List-Id: 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!"