Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.dougwise.org!nntpfeed.proxad.net!proxad.net!feeder1-1.proxad.net!198.186.194.250.MISMATCH!news-out.readnews.com!news-xxxfer.readnews.com!news.misty.com!news.iecc.com!nerds-end From: eliben Newsgroups: comp.compilers Subject: Maintaining scope while parsing C with a YACC grammar Date: Mon, 25 Apr 2011 05:14:42 -0700 (PDT) Organization: Compilers Central Lines: 31 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <11-04-036@comp.compilers> NNTP-Posting-Host: news.iecc.com X-Trace: gal.iecc.com 1303795799 26368 64.57.183.58 (26 Apr 2011 05:29:59 GMT) X-Complaints-To: abuse@iecc.com NNTP-Posting-Date: Tue, 26 Apr 2011 05:29:59 +0000 (UTC) Keywords: parse, symbols, question Posted-Date: 26 Apr 2011 01:29:59 EDT 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:103 Hello, Suppose I'm parsing C with a YACC-like grammar. While parsing this code: int main() { int a = 1; { /* internal scope */ int b = 2; } } I want to know that the declaration "int b = 2" happens inside an internal scope. My problem is that the way YACC grammars (and bottom- up parsing in general) are structured, "int b = 2" is analyzed *before* the whole block { int b = 2;} so I've seen "int b = 2" before I've seen the complete block. What is the usual solution to this problem? Thanks in advance [There's a couple of possibilities. One is to add separate rules for the open and close braces with action code that increments and decrements the nesting level, so you know when you reduce the declaration what scope it is in. Another is to parse the whole thing into an AST without trying to interpret the symbols other than making pointers to a generic symbol table entry per name, then walk the AST and add the scope and type info. Perhaps people will have other suggestions. -John]