caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Remi Vanicat <vanicat@labri.u-bordeaux.fr>
To: caml-list@inria.fr
Subject: Re: [Caml-list] eliminating shift/reduce conflicts
Date: Fri, 12 Sep 2003 12:46:02 +0200	[thread overview]
Message-ID: <87fzj2474l.dlv@wanadoo.fr> (raw)
In-Reply-To: <Pine.LNX.4.33.0309121120560.3190-100000@ait780f.ait.physik.uni-tuebingen.de> (Eckart Goehler's message of "Fri, 12 Sep 2003 11:29:29 +0200 (CEST)")

Eckart Goehler <goehler@astro.uni-tuebingen.de> writes:

> Hi,
>
> If I understand the ommited part right, the poor parser below seems te
> have the burden to decide which rule to use when a "FOO" occurs: either
> tracing bar expecting more "FOO"s from the foo_list (that is
> reducing), 

This is shifting, not reducing...

> or to decide for the "baz" rule and fail when the next token is a
> "COMMA" instead of a "COLON". Therefore ocamlyacc (and yacc also)
> complain, and using the rule which performs the reduce step (bar)
> (AFAIK).

This is not at all the way an LALR parser work.

the problem here is when a parser read the COLON in something like :

FOO COLON ...

then it don't know if it's in the middle of the bar rule (FOO being a
foo_list, and then the foo_list is to be reduce) or in the middle of a
baz rule (that should be shifted from before the COLON to after the
COLON). 

By the way this grammar doesn't seem to be even LR(1), so the
simplification seem very difficult. the only way I see is :

bar: foo_list COLON xyzzy { $3 }

baz: foo_list COLON yzzyx { match $1 with 
                            | [_] -> $3
                            | _   -> raise an error here }




>
> Thats what you result using a completed ocamlyacc example:
> ------------------------------------------------------------------
> %token <string> FOO
> %token <string> COLON
> %token <string> COMMA
> %token <string> CHAR
>
> %start main
> %type <string> main
>
> %%
>
> main: bar {$1}
>   |   baz {$1}
>       ;
>
> bar: foo_list COLON xyzzy { $3 }
>
> baz: FOO COLON yzzyx { $3 }
>
>
> foo_list: FOO { [$1] }
>   | foo_list COMMA FOO { $3 :: $1 }
>   ;
>
> xyzzy: CHAR { $1 }
>     ;
>
> yzzyx: CHAR { $1 }
>     ;
> -------------------------------------------------------------
>
> If you really want to distinguish between bar (single FOO) and baz
> (multiple FOO), eg. to store a variable declaration/list, you must this do
> explicitely by stating that foo_list contains more than one item:
>
> foo_list:  FOO COMMA FOO {$3::[$1]}
>   | FOO COMMA foo_list { $3 :: $1 }
>   ;
>
> If your grammar is different, you have to supply a completed example.
>
> ciao
>
> eckart
>
> On Fri, 12 Sep 2003, Rafael 'Dido' Sevilla wrote:
>
>> I have an ocamlyacc grammar that contains productions that look like:
>>
>> foo_list: FOO { [$1] }
>>   | foo_list COMMA FOO { $3 :: $1 }
>>   ;
>>
>> which creates a list of FOO objects.  I however have some rules that
>> need to be prefixed by either a single FOO or a foo_list, like so:
>>
>> bar: foo_list COLON xyzzy { ... }
>>
>> and
>>
>> baz: FOO COLON yzzyx { ... }
>>
>> This of course produces a shift/reduce conflict, and shifting fails to
>> parse the 'bar' correctly.  Perhaps I need to read a compiler
>> construction textbook more thoroughly to figure out this answer, but any
>> hints out there on getting rid of this shift/reduce.
>>
>> -------------------
>> 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
>>
>
> -----------------------------------------------------
>
> 	Eckart Goehler
>         Sand 1
> 	IAAT, Astronomy
> 	72076 Tuebingen
>
> 	Tel.   : ++49-7071-297 54 73
> 	Fax.   : ++49-7071-29 34 58
> 	e-mail : goehler@astro.uni-tuebingen.de
>
> -----------------------------------------------------
>
> -------------------
> 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

-- 
Rémi Vanicat
remi.vanicat@laposte.net

-------------------
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


  reply	other threads:[~2003-09-12 10:46 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-12  8:26 Rafael 'Dido' Sevilla
2003-09-12  8:36 ` Benjamin Geer
2003-09-12  8:40 ` Christian Lindig
2003-09-12  9:22   ` Rafael 'Dido' Sevilla
2003-09-12  9:29 ` Eckart Goehler
2003-09-12 10:46   ` Remi Vanicat [this message]
2003-09-12 14:04 ` Ken Rose
2003-09-12 14:55 ` Eric C. Cooper

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=87fzj2474l.dlv@wanadoo.fr \
    --to=vanicat@labri.u-bordeaux.fr \
    --cc=caml-list@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;
as well as URLs for NNTP newsgroup(s).