caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] What's wrong with my parser ?
@ 2002-07-12  2:41 Nicolas FRANCOIS
  2002-07-12  2:48 ` John Prevost
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Nicolas FRANCOIS @ 2002-07-12  2:41 UTC (permalink / raw)
  To: Caml List

I define a polynom parser like this :

  let rec parse =
    let parse_puissance = parser
      | [< ''^'; e = parse_int >] -> e
      | [< >] -> 1
    in
    let parse_x = parser
      | [< ''X'; e = parse_puissance >] -> e
      | [< >] -> 0
    in
    let parse_coeff = parser
      | [< n = R.parse >] -> n
      | [< >] -> R.one
    in
    let parse_monome = parser
      | [< n = R.parse; e = parse_x >] ->
	  monome n e
      | [< e = parse_x >] ->
	  monome R.one e
    in
      parser
	| [< ''+'; m = parse_monome; p = parse >] ->
	    m ++ p
	| [< ''-'; m = parse_monome; p = parse >] ->
	    (opp m) ++ p
	| [< m = parse_monome; p = parse >] ->
	    m ++ p
	| [< >] -> zero

parse_int and the R.parse functions work OK, and I'll add all the
"_=parse_space" after. But :

# let p1 = P.parse (Stream.of_string "1+X");;
Stack overflow during evaluation (looping recursion?).

What's the problem ?

\bye

-- 

                   Nicolas FRANCOIS
            http://nicolas.francois.free.fr
 A TRUE Klingon programmer does NOT comment his code
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] What's wrong with my parser ?
  2002-07-12  2:41 [Caml-list] What's wrong with my parser ? Nicolas FRANCOIS
@ 2002-07-12  2:48 ` John Prevost
  2002-07-12  2:59 ` John Prevost
  2002-07-13 11:27 ` Nicolas FRANCOIS
  2 siblings, 0 replies; 6+ messages in thread
From: John Prevost @ 2002-07-12  2:48 UTC (permalink / raw)
  To: Nicolas FRANCOIS; +Cc: Caml List

>>>>> "nf" == Nicolas FRANCOIS (AKA El Bofo) <nicolas.francois@free.fr> writes:

    nf> I define a polynom parser like this : let rec parse = let

{...}

    nf> What's the problem ?

What's the definition of R.parse?  It isn't in the code you excerpted.

John.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] What's wrong with my parser ?
  2002-07-12  2:41 [Caml-list] What's wrong with my parser ? Nicolas FRANCOIS
  2002-07-12  2:48 ` John Prevost
@ 2002-07-12  2:59 ` John Prevost
  2002-07-12  7:14   ` Daniel de Rauglaudre
  2002-07-13 11:27 ` Nicolas FRANCOIS
  2 siblings, 1 reply; 6+ messages in thread
From: John Prevost @ 2002-07-12  2:59 UTC (permalink / raw)
  To: Nicolas FRANCOIS; +Cc: Caml List

>>>>> "nf" == Nicolas FRANCOIS (AKA El Bofo) <nicolas.francois@free.fr> writes:

    nf> I define a polynom parser like this : let rec parse = let

  let rec parse =
    let parse_puissance = parser
      | [< ''^'; e = parse_int >] -> e
      | [< >] -> 1
    in
    let parse_x = parser
      | [< ''X'; e = parse_puissance >] -> e
      | [< >] -> 0
    in
    let parse_coeff = parser
      | [< n = R.parse >] -> n
      | [< >] -> R.one
    in
    let parse_monome = parser
      | [< n = R.parse; e = parse_x >] ->
	  monome n e
      | [< e = parse_x >] ->
	  monome R.one e
    in
      parser
	| [< ''+'; m = parse_monome; p = parse >] ->
	    m ++ p
	| [< ''-'; m = parse_monome; p = parse >] ->
	    (opp m) ++ p
	| [< m = parse_monome; p = parse >] ->
	    m ++ p
	| [< >] -> zero


    nf> parse_int and the R.parse functions work OK, and I'll add all
    nf> the "_=parse_space" after. But :

# let p1 = P.parse (Stream.of_string "1+X");;
Stack overflow during evaluation (looping recursion?).

    nf> What's the problem ?

Ahh.  I didn't look closely enough.  The problem can be seen by
looking at what happens when you try to parse the empty stream:

in parse:
  [< >] -> cases 1 and 2 fail, tries [< m = parse_monome; p = parse >]
    in m = parse_monome:
      [< >] -> I assume R.parse fails, so it tries [< e = parse_x >]
        in parse_x
          [< >] -> case 1 fails, case 2 [< >] succeeds
          parse_x returns 0
      parse_monome returns monome R.one 0
  [< m = parse_monome; ... >] succeeded, move to [< ...; p = parse >]

And at this point, parse is called on [< >] again and it loops.
Unfortunately, I can't remember how to explicitly check for the end of
the stream--and it's been removed from the O'Caml manual.  That's what
you have to do to avoid this.  A quick and dirty hack is to have a
special symbol (";", for instance) at the end of every phrase.

John.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] What's wrong with my parser ?
  2002-07-12  2:59 ` John Prevost
@ 2002-07-12  7:14   ` Daniel de Rauglaudre
  0 siblings, 0 replies; 6+ messages in thread
From: Daniel de Rauglaudre @ 2002-07-12  7:14 UTC (permalink / raw)
  To: Caml List

Hi,

On Thu, Jul 11, 2002 at 10:59:20PM -0400, John Prevost wrote:

> And at this point, parse is called on [< >] again and it loops.
> Unfortunately, I can't remember how to explicitly check for the end of
> the stream

It is not the point: even testing the end of the stream would not
help, since the example did not reach the end of the stream, it
took no token at all (no character at all) from the stream.

> --and it's been removed from the O'Caml manual.

It has been copied is in the Camlp4 manual, but perhaps not yet in
the 3.04 version.
    http://caml.inria.fr/camlp4/manual/manual003.html

However the module "Stream" is still part of the OCaml manual. To test
the empty stream, call the parser Stream.empty:
     [< _ = Stream.empty >] ->

-- 
Daniel de RAUGLAUDRE
daniel.de_rauglaudre@inria.fr
http://cristal.inria.fr/~ddr/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] What's wrong with my parser ?
  2002-07-12  2:41 [Caml-list] What's wrong with my parser ? Nicolas FRANCOIS
  2002-07-12  2:48 ` John Prevost
  2002-07-12  2:59 ` John Prevost
@ 2002-07-13 11:27 ` Nicolas FRANCOIS
  2 siblings, 0 replies; 6+ messages in thread
From: Nicolas FRANCOIS @ 2002-07-13 11:27 UTC (permalink / raw)
  To: Nicolas FRANCOIS; +Cc: caml-list

OK, this is my new polynom parser, it seems to work OK, thanks to your
explanations.

  let rec parse s =
    let parse_puissance = parser
      | [< ''^'; e = parse_int >] -> e
      | [< >] -> 1
    in
    let parse_x = parser
      | [< ''X'; e = parse_puissance >] -> e
      | [< >] -> 0
    in
    let parse_coeff = parser
      | [< n = R.parse >] -> n
      | [< >] -> R.one
    in
    let parse_monome = parser
      | [< n = parse_coeff; e = parse_x >] ->
	  monome n e
      | [< e = parse_x >] ->
	  monome R.one e
    in
    let rec parse_suite = parser
      | [< ''+'; m = parse_monome; p = parse_suite >] ->
	  m ++ p
      | [< ''-'; m = parse_monome; p = parse_suite >] ->
	  (opp m) ++ p
      | [< >] -> zero
    in
      match s with parser
	| [< m = parse_monome >] ->
	    match parse_suite s with
	      | p -> m ++ p

and the results :

# print (P.parse (Stream.of_string "-1+3X+4X^2"));;
[3: -1, 3, 4]- : unit = ()
# print (P.parse (Stream.of_string ""));;
[1: 1]- : unit = ()

Oups !!

What do you think about this ?

\bye

-- 

                   Nicolas FRANCOIS
            http://nicolas.francois.free.fr
 A TRUE Klingon programmer does NOT comment his code
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] What's wrong with my parser ?
@ 2002-07-13 19:44 Ryan Tarpine
  0 siblings, 0 replies; 6+ messages in thread
From: Ryan Tarpine @ 2002-07-13 19:44 UTC (permalink / raw)
  To: nicolas.francois; +Cc: caml-list

>From: Nicolas FRANCOIS (AKA El Bofo) <nicolas.francois@free.fr>
>To: Nicolas FRANCOIS (AKA El Bofo) <nicolas.francois@free.fr>
>CC: caml-list@inria.fr
>Subject: Re: [Caml-list] What's wrong with my parser ?
>Date: Sat, 13 Jul 2002 13:27:34 +0200
>
>OK, this is my new polynom parser, it seems to work OK, thanks to your
>explanations.
>
>   let rec parse s =
><snip>
>     let parse_coeff = parser
>       | [< n = R.parse >] -> n
>       | [< >] -> R.one
>     in
>     let parse_monome = parser
>       | [< n = parse_coeff; e = parse_x >] ->
>	  monome n e
>       | [< e = parse_x >] ->
>	  monome R.one e
><snip>
>     in
>       match s with parser
>	| [< m = parse_monome >] ->
>	    match parse_suite s with
>	      | p -> m ++ p
>
><snip>
># print (P.parse (Stream.of_string ""));;
>[1: 1]- : unit = ()
>

Parsing the empty string calls parse_monome, which calls parse_coeff, which 
returns R.one.  My take at this is that you need 2 versions of parse_x: one 
that requires an X to be there, and one that can parse an X but doesn't need 
it.

If there is no leading coefficient (the second option to parse_monome), the 
X *must* be there.  If the coeffecient is there (the first option), then the 
X doesn't have to be.  The empty string, which has no coefficient, should 
fail parse_monome because it doesn't have an X either.  If passed the string 
"X" or "2", though, parse_monome should succeed.

Ryan Tarpine, rtarpine@hotmail.com
"To err is human, to compute divine.  Trust your computer but not its 
programmer."
  - Morris Kingston

_________________________________________________________________
Send and receive Hotmail on your mobile device: http://mobile.msn.com

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2002-07-13 19:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-07-12  2:41 [Caml-list] What's wrong with my parser ? Nicolas FRANCOIS
2002-07-12  2:48 ` John Prevost
2002-07-12  2:59 ` John Prevost
2002-07-12  7:14   ` Daniel de Rauglaudre
2002-07-13 11:27 ` Nicolas FRANCOIS
2002-07-13 19:44 Ryan Tarpine

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).