From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id LAA31861; Fri, 12 Sep 2003 11:29:31 +0200 (MET DST) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id LAA14903 for ; Fri, 12 Sep 2003 11:29:29 +0200 (MET DST) Received: from ait780f.ait.physik.uni-tuebingen.de (ait780f.ait.physik.uni-tuebingen.de [134.2.76.59]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h8C9TTT03000 for ; Fri, 12 Sep 2003 11:29:29 +0200 (MET DST) Received: from localhost (goehler@localhost) by ait780f.ait.physik.uni-tuebingen.de (8.9.2/8.9.2) with ESMTP id LAA06498 for ; Fri, 12 Sep 2003 11:29:29 +0200 (CEST) X-Authentication-Warning: ait780f.ait.physik.uni-tuebingen.de: goehler owned process doing -bs Date: Fri, 12 Sep 2003 11:29:29 +0200 (CEST) From: Eckart Goehler X-X-Sender: To: Subject: Re: [Caml-list] eliminating shift/reduce conflicts In-Reply-To: <20030912082632.GA9048@imperium.ph> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 foo:01 foo:01 baz:01 char:01 baz:01 char:01 rafael:01 'dido':01 bug:01 faq:01 faq:01 beginner's:01 beginners:01 astronomy:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk 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), 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). Thats what you result using a completed ocamlyacc example: ------------------------------------------------------------------ %token FOO %token COLON %token COMMA %token CHAR %start main %type 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