Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!goblin1!goblin.stu.neva.ru!usenet.stanford.edu!news.iecc.com!nerds-end From: Quinn Tyler Jackson Newsgroups: comp.compilers Subject: Re: How detect cycle in grammar ? Date: Fri, 2 Dec 2011 09:20:55 -0800 Organization: Compilers Central Lines: 62 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <11-12-008@comp.compilers> References: <11-11-041@comp.compilers> <11-11-045@comp.compilers> <11-11-050@comp.compilers> <11-11-057@comp.compilers> <11-11-066@comp.compilers> <11-11-068@comp.compilers> <11-12-004@comp.compilers> NNTP-Posting-Host: news.iecc.com X-Trace: leila.iecc.com 1323028837 34833 64.57.183.58 (4 Dec 2011 20:00:37 GMT) X-Complaints-To: abuse@iecc.com NNTP-Posting-Date: Sun, 4 Dec 2011 20:00:37 +0000 (UTC) Keywords: parse, errors Posted-Date: 04 Dec 2011 15:00:36 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: x330-a1.tempe.blueboxinc.net comp.compilers:380 On Thu, Dec 1, 2011 at 2:46 AM, Paul B Mann wrote: > The LRSTAR parser generator reports two errors in this grammar: > > S -> A|B > A -> A > B -> t > > > LRSTAR Basic 3.0.137 Copyright 2011 Compilerware. > > silly.grm(6) : Useless production. > > silly.grm(6) : Nonterminal symbol in cycle, cannot derive anything. > > 0 min 0.000 sec, 0.728 MB, 0 warnings, 2 errors. The Meta-S parser generator reports two errors: eV005: Cyclic Recursion (on A->A since Meta-S is top-down, A->A is illegal cyclic recursion) eV008: Class expected as parameter (on S->A|B, since A did not compile, and therefore A|B does not resolve A to any valid rule) A variation of the above grammar that generates the same errors is: > S -> A|B > A -> [B] A > B -> t Because A obviously expands to: A -> B A A -> A Which ends up in the same left-recursive hole. A -> C A C -> [B] of course generates the same error because effectively it's just another way to say A -> [B] A and can lead to potential recursion. I suppose the reason I'm bringing this up is that I mentioned earlier that in adaptive grammars it is possible to write grammars that have rules that are not known until parse-time to derive terminals on any given rule. Because the parse is top down, however, A -> A is a case of a rule that generates an error because it is malformed per the Adaptive-K algorithm. That said: S -> A|B A -> C A C -> x.y B -> "t" Is a case where x.y *may* contain the empty string at parse time, or may not (depending on input), and so is not thrown away with an error. This is where writing adaptive grammars becomes a creative exercise. Quinn