Path: csiph.com!goblin3!goblin.stu.neva.ru!news.misty.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: luser droog Newsgroups: comp.compilers Subject: Re: Supporting multiple input syntaxes Date: Thu, 20 Aug 2020 14:45:28 -0700 (PDT) Organization: Compilers Central Lines: 40 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <20-08-012@comp.compilers> References: <20-08-002@comp.compilers> <20-08-009@comp.compilers> <20-08-010@comp.compilers> <20-08-011@comp.compilers> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="68517"; mail-complaints-to="abuse@iecc.com" Keywords: parse Posted-Date: 23 Aug 2020 14:39:28 EDT X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com In-Reply-To: <20-08-011@comp.compilers> Xref: csiph.com comp.compilers:2564 On Sunday, August 16, 2020 at 10:53:24 AM UTC-5, davidl...@gmail.com wrote: > My friend, reporting the furthest position examined by the parser I have [found] > useful in error cases as a simple stop gap when using a combinator approach. > > Thinking about it you kind of want to see the furthest failed position and the > stack of rules above it. Such requires meta information when the code is > written in the most natural way. For this reason and others I believe it is > good to represent your grammar in data structures which is further in the > direction of a compiler compiler tool (or compiler interpreter tool). Thanks. I've done some further investigating. I built my parsers following two papers. Hutton and Meijer, Monadic Parser Combinators https://www.cs.nott.ac.uk/~pszgmh/monparsing.pdf and Hutton, Higher-Order Functions for Parsing https://pdfs.semanticscholar.org/6669/f223fba59edaeed7fabe02b667809a5744d9.pdf The first adds error reporting using Monad Transformers. I'm thinking about how to move in this direction, but first I'd need to reformulate the code to make the Monad more explicit. It should be something like an interface or a mixin, like a base class with all virtual member functions. That could be done by modelling my objects more like OO objects and have 'bind' and 'result' in a vtable in the Parser object. But the second paper does it differently, and maybe something I can do more easily. It redefines the parsers to no longer produce a list of results, so there's no longer support for ambiguity. Then it defines them to return a Maybe, maybe * ::= Fail [char] | Error [char] | OK * . where the OK branch has the parse tree, and Fail or Error both contain an error message. It describes how a Fail can be transformed into an Error. But it isn't entirely clear where the messages get injected. Still need to do some thinking on it, but I think I can rewrite the parsers to follow this model, and then decorate my grammar with possible errors at each node. Thanks for the encouragement. My classes start on Monday so I'm hoping to accomplish something on this before then.