Path: csiph.com!xmission!news.snarked.org!border2.nntp.dca1.giganews.com!nntp.giganews.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: Thomas Koenig Newsgroups: comp.compilers Subject: Re: implementation languages, was Supporting multiple input syntaxes Date: Mon, 24 Aug 2020 17:01:59 -0000 (UTC) Organization: news.netcologne.de Lines: 41 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <20-08-017@comp.compilers> References: <20-08-002@comp.compilers> <20-08-009@comp.compilers> <20-08-010@comp.compilers> <20-08-011@comp.compilers> <20-08-012@comp.compilers> <20-08-014@comp.compilers> <20-08-015@comp.compilers> Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="31239"; mail-complaints-to="abuse@iecc.com" Keywords: parse, comment Posted-Date: 24 Aug 2020 15:12:10 EDT X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:2569 luser droog schrieb: [PostScript] > But the language itself I just really enjoy. It's my "Lego blocks" > language. The RPN syntax removes all ambiguity about precedence and > sequencing. I recently had the doubtful pleasure of evaluating the formula x = ((a-b)*c^2+(-d^2+e^2-a^2+b^2)*c+a^2*b+(f^2-e^2-b^2)*a +(-f^2+d^2)*b)/((-2*d+2*e)*c+(2*f-2*e)*a-2*b*(f-d)) in Postscript. (Yes, really. Don't ask.) It was the first time in more than a decade that I wrote a flex/bison grammar (mostly copied from the bison manual). It was faster and less error-prone than trying to do it directly. The grammar actually generated fairly unidiomatic PostScript because I made it give names to all the variables, so a-b became a b sub I'm sure a real PostScript aficionado would have done it all on the stack :-) [Turning infix into RPN is a pretty basic intro compiler course exercise. Conceptually, you make the parse tree and then do a postorder tree walk. Or if you'rs using yacc or bison, in the expression grammar you just print the operator or token in the code for each rule because they are recognized in the right order, e.g.: expr: VARIABLE { printf(" %s ", $1): } | expr '+' expr ( printf(" add "); } | expr '-' expr ( printf(" sub "); } | '(' expr ')' { /* print nothing */ } -John]