Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: skaller <skaller@users.sourceforge.net>
To: Francois.Pottier@inria.fr
Cc: Caml List <caml-list@inria.fr>, menhir-list@yquem.inria.fr
Subject: Re: [Caml-list] Re: [Menhir-list] There's an elephant in the room: Solution to sharing a symbol table
Date: Thu, 03 May 2007 02:07:26 +1000	[thread overview]
Message-ID: <1178122046.6486.31.camel@rosella.wigram> (raw)
In-Reply-To: <20070502115635.GA21560@yquem.inria.fr>

On Wed, 2007-05-02 at 13:56 +0200, Francois Pottier wrote:
> Hello,
> 
> On Wed, May 02, 2007 at 07:04:50PM +1000, skaller wrote:
> > You can't. Don't be confused by functor interface in Menhir. 
> > It is useless for maintaining state.
> 
> I don't think so...

State must be maintained in function arguments.

Functors are entirely irrelevant. This is about associating
data with a thread of control.

Joel asked:

"How do you write parse above with the %parameter approach to ensure  
that parse ALWAYS uses a new symbol table that is shared between the  
lexer and the parser in this parsing run?"

and the answer is you have to pass an argument to the parser function.

> > What you need is a feature I asked for .. the possibility of
> > passing a state argument to the parser the same way you can
> > now do for ocamllex: you just write
> > 
> > 	rule fred state = parse ...
> 
> I remember our discussion. What you need primarily, if I recall
> correctly, is the ability for a semantic action to recursively
> invoke the parser itself. This happens to work if the parser is
> defined as a recursive function, and does not (currently) work
> when the parser is defined as a functor, because the functor is
> not declared as recursive. We could, in principle, make it a
> recursive functor, which would allow recursive invocations.

Let me give you a real example: I have a parser that
reads Felix code that looks like:

fun f .. // felix stuff
include "filename";
fun g .. //


When the parser sees the include statement it parses the
file 'filename'. The parse of the included file, in Felix,
is independent of the surrounding code. The parser is
called recursively and the resulting AST is returned
from the user action.

There is no way to do this without passing a state variable
on the stack. In fact Felix uses a variable passed to the
lexer to work around the deficiency in Ocamlyacc .. it
passes the variable to the parser in a token .. :)

[That works with Menhir too by the way]

-- 
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net


  reply	other threads:[~2007-05-02 16:07 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-01 21:39 Joel Reymont
2007-05-02  5:44 ` [Menhir-list] " Francois Pottier
2007-05-02  5:58   ` Joel Reymont
     [not found]     ` <20070502070345.GA5242@yquem.inria.fr>
2007-05-02  7:35       ` Joel Reymont
2007-05-02  9:04     ` [Caml-list] " skaller
2007-05-02 11:56       ` Francois Pottier
2007-05-02 16:07         ` skaller [this message]
2007-05-02 18:30           ` Francois Pottier
2007-05-03  1:17             ` skaller
2007-05-03  8:48               ` Joel Reymont

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=1178122046.6486.31.camel@rosella.wigram \
    --to=skaller@users.sourceforge.net \
    --cc=Francois.Pottier@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=menhir-list@yquem.inria.fr \
    /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