Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Paul Hilfinger <hilfingr@gnat.com>
To: drow@false.org
Cc: cagney@gnu.org, gdb-patches@sources.redhat.com
Subject: Re: [RFA] Add language-dependent post-parser
Date: Thu, 01 Apr 2004 10:43:00 -0000	[thread overview]
Message-ID: <20040401104307.57A9EF2EA1@nile.gnat.com> (raw)
In-Reply-To: <20040331165810.GA32347@nevyn.them.org> (message from Daniel Jacobowitz on Wed, 31 Mar 2004 11:58:10 -0500)


OK guys, where do we stand?  As Daniel has indicated, more elegant
options than mine appear to involve a great deal of work to existing,
stable parsing and evaluation code that works quite well right now,
thank you, and whose only offense is to be inelegant.  Ada customers
have had the functionality of being able to detect, report, and
resolve ambiguous references at parsing time (rather than at
unexpected later moments when a saved expression is evaluated) for
years, and it works pretty well (I commend the approach to the C++
folks, in fact).  How about it?

A few responses:

> > >But I guess the point is, this is no more elegant than a second pass,
> > >and whatever you implement I should probably use for C++ anyway so it
> > >won't be an Ada-specific hook.  Does anyone else have an opinion?

I guess I don't share Daniel's distaste for multiple passes.
Generally, I've found them a useful way to cleanly modularize
sequences of transformations on an AST.   In production compilers, the 
downside is performance, but as Daniel also says, this really is not
an issue with the scale of parsing we do in GDB.


> > Ok, two thoughts:
> > 
> > - how come it's in this compressed postfix form?
> > This could hardly be a memory usage problem?
> 
> Hardly - since expressions are so short-lived.  I think it's more
> likely the emphasis was on postfix than on compressed.  I wasn't around
> when any of this was being designed, of course :)  But there are two
> plausible ways to structure this sort of yacc parser - either postfix
> or tree.  Apparently someone prefered postfix.  Which is then awkward
> to work with so it becomes prefix later.
> 
> If we're going to really clean this up, I think that using a tree
> instead would be the way to go.  That's a lot of work though.

Agreed, alas.  And this change would then have to propagate through the 
evaluator code as well.  

> > - could multi-pass be better / cleaner long term?
> > Is there a language (that we care about) with overload semantics so 
> > screwed up that both the containing expression and the parameters are 
> > needed when resolving the name?
> 
> I don't think there is.

Well, there are actually two: Ada and C++ (quick, who can tell me
where C++ uses type context in name resolution?).  However, in both
cases, the GDB implementors (i.e., me in the case of Ada) chose to
ignore this part of the language for the most part, and rely on simple
bottom-up resolution.  Type resolution by context can be handy for
producing "special effects" of abstraction, but very seldom in cases
that matter much to people typing expressions into GDB.

> > One way to get an answer is to ask: how to the corresponding compilers 
> > (Ada, Java, ObjC, C++) all implement this?
> 
> The only ones I'm familiar with (GCC, EDG, etc.) all do it using a tree
> structure.  A linearized representation is just too restrictive.  And
> multi-pass is out of the question if you want good performance; while
> for GDB the performance of the expression parser is pretty marginal,
> and the expressions we parse are pretty small, for a compiler this is a
> critical bottleneck.  Every additional pass over the parse tree has a
> high cost.

At the risk of starting an irrelevant tangential discussion, I can't
resist commenting on this.  In the case of tree representations, this
cost is not as high as one might think.  Suppose we have a 10,000-line
program with 100 AST nodes per parsed line (sounds fairly generous to
me).  The overhead of a tree traversal then involves one dynamic type
dispatch (we'll say this is a C++ implementation) per node, plus a
fetch and null test for each node (for the edge leading from its
parent, counting empty trees among the 100 figure).  On today's
machines, we're talking small fractions of a second here.

Paul Hilfinger







  reply	other threads:[~2004-04-01 10:43 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-30  9:24 Paul Hilfinger
2004-03-30 14:27 ` Daniel Jacobowitz
2004-03-31  8:02   ` Paul Hilfinger
2004-03-31 15:30     ` Daniel Jacobowitz
2004-03-31 15:36       ` Daniel Jacobowitz
2004-03-31 16:49         ` Andrew Cagney
2004-03-31 16:58           ` Daniel Jacobowitz
2004-04-01 10:43             ` Paul Hilfinger [this message]
2004-04-02 16:25               ` Andrew Cagney
  -- strict thread matches above, loose matches on Subject: below --
2004-03-19  0:09 Paul Hilfinger
2004-03-04 11:33 ` Paul Hilfinger
2004-03-19  0:09 ` Daniel Jacobowitz
2004-03-04 22:29   ` Daniel Jacobowitz
2004-03-05  8:15   ` Paul Hilfinger
2004-03-19  0:09     ` Paul Hilfinger
2004-04-02 16:33 ` Daniel Jacobowitz
2004-04-03 12:05   ` Paul Hilfinger
2004-04-07  9:32   ` Paul Hilfinger
2004-04-09 22:40     ` Daniel Jacobowitz
2004-04-10 22:12       ` Paul Hilfinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040401104307.57A9EF2EA1@nile.gnat.com \
    --to=hilfingr@gnat.com \
    --cc=cagney@gnu.org \
    --cc=drow@false.org \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox