Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!border3.nntp.dca.giganews.com!border1.nntp.dca.giganews.com!nntp.giganews.com!news.iecc.com!.POSTED!nerds-end From: Jim Patchell Newsgroups: comp.compilers Subject: Re: Please comment on my first parser Date: Sat, 13 Oct 2012 20:50:14 -0700 (PDT) Organization: Compilers Central Lines: 77 Sender: johnl@iecc.com Approved: comp.compilers@iecc.com Message-ID: <12-10-008@comp.compilers> References: <12-10-004@comp.compilers> NNTP-Posting-Host: news.iecc.com Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 X-Trace: leila.iecc.com 1350250518 16128 64.57.183.58 (14 Oct 2012 21:35:18 GMT) X-Complaints-To: abuse@iecc.com NNTP-Posting-Date: Sun, 14 Oct 2012 21:35:18 +0000 (UTC) Keywords: parse Posted-Date: 14 Oct 2012 17:35:18 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:766 On Wednesday, October 10, 2012 6:28:33 AM UTC-7, Bart Vandewoestyne wrote: > [ a parser] Hello Bart, Well, it is nice to know there are other parser/compiler hobbyists out there besides myself. I think your grammar has a few problems in it, however. You start off with: program: expression expression : INT | STRING | BREAK ... etc and then later on you have... arithmetic_expression : expression PLUS expression | expression MINUS expression | expression TIMES expression | expression DIVIDE expression If you BREAK production is some sort of a program flow control you could write BREAK + BREAK as a legal arithmetic_expresion. I don't thing you meant that. This is how I would start your grammar: program: statements, eof //this means we have a list of statements followed by end of file statements: statment //this is a left recursion rule for | statements, statement //making a list of statements statement: declarations | looping_statements | conditional_statments | assignments assignments: lvalue EQUALS expression expression: expression MUL addexpr | expression DIV addexpr | addexpr addexpr: addexpr PLUS urnary | addexpr MINUS urnary | urnary urnary : primary | MINUS primary primary :IDENTIFIER |CONSTANT | STRING | LPAREN, expression, RPARAN etc..... I sure hope I didn't make any grievous errors in that. There is a lot to be filled in also, Obviously. Also, your grammar looks like it was written for either yacc or bison. Those are OK, but, there are better parser generators out there, and by better, I mean easier to use. Take a look at Anagram ( http://www.parsifalsoft.com/ ) and LRstar (http://www.compilerware.com) seems to be offline at the moment :-( and ANTLR ( http://www.antlr.org/ ) I haven't actually really tried ANTLR yet, but it is a very well documented package. Anagram and LRstar are my two fav LALR(1) parser generators. LRstar will even do LALR(k). ANTLR generates the so called LL(k) parsers.