Build Problems Resolved

by way of "Mark S. Miller" <markm@caplet.com> mzukowski@bco.com
Thu, 02 Sep 1999 12:08:31 -0700


Excellent overview.  I'm having a disconnect on some things.  What's the
difference between the $ and the @?  Does $ substitute and @ match?  So your
first match in there substitues in var, then parses it and then matches it
filling in exp with a subtree?

How exactly to you match trees?  Do you first compile the match expression
into a tree and then compare the results?  How do you distinguish between
parents and children?

define deriv(expr, var) {

                       switch (expr) {

                           match e`$var ** @exp` ? (isConst(exp))  {
                               e`$exp * $var ** ($exp -1)`
                           }
                           match e`@a + @b` {
                               define da := deriv(a, var)
                               define db := deriv(b, var)
                               e`$da + $db`

I was also trying to think of when I would want to use a different kind of
quasi-parser based on a grammar.  For instance I wrote an ANTLR grammar for
gcc, but I'm not sure what kinds of interesting things I could be doing with
it inside of E.  The most obvious is tree rewriting, but I can already do
that in ANTLR itself, not sure what the advantage would be with
quasi-parsing.

My mindset is dominated by having the parser driving the control of a
program, so maybe I'm just not "getting it" or I'm trying to solve problems
which aren't appropriate for quasi-parsers.

My attempt at an ANTLR translation:
derivExpr(expr, var):  // by definition we're parsing the AST in the first
argument
	#("**" var1:expr exp:constant) { #derivExpr = #(#[MULT, "*"], exp,
#(#[EXP,"**"], var, #[]) ) } //build the new tree
|	#("+" e1:derivExpr(var) e2:derivExpr(var)) //tree automatically
built
;

OK, yours is much much easier to read as far as what is output.  But you are
matching trees against trees and not really parsing trees, I think.  Why
does that matter?  Overhead, and generality.  You have to generate a tree
for every expression you match against.

Hmm, I have more thinking to do.  Given a separate grammar you could enter
it from a quasi-pattern...or you could specify grammar fragments in the
quasi-pattern... but you don't want to parse a whole program, just a sub
tree...

Sorry my thoughts are so fragmented.  I'll return to it tomorrow.

Monty