Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!news-out.readnews.com!news-xxxfer.readnews.com!news.misty.com!news.iecc.com!.POSTED!nerds-end From: noitalmost Newsgroups: comp.compilers Subject: Re: Having trouble converting composite variables to intermediate form Date: Mon, 10 Mar 2014 15:18:43 -0400 Organization: Compilers Central Lines: 37 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <14-03-019@comp.compilers> References: <14-02-029@comp.compilers> NNTP-Posting-Host: news.iecc.com Mime-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit X-Trace: miucha.iecc.com 1394492248 23337 64.57.183.58 (10 Mar 2014 22:57:28 GMT) X-Complaints-To: abuse@iecc.com NNTP-Posting-Date: Mon, 10 Mar 2014 22:57:28 +0000 (UTC) Keywords: code Posted-Date: 10 Mar 2014 18:57:27 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:1141 On Friday, February 28, 2014 11:27:00 AM Momchil Velikov wrote: > On Saturday, February 22, 2014 7:32:01 PM UTC+2, noitalmost wrote: > > x := r.a[2] + 5; > > > > > > After parsing, the Wirl AST fragment looks like: > > > > Assign > > > > Ident x > > Op + > > > > RecAccess > > > > Ident r > > ArrAccess > > > > Ident a > > Num 2 > > You have currently > > RecAccess(r, ArrAccess(Ident(a), Num(2))) > > Note, however, that the array is not `a`, it's `r.a`. The subtree > `ArrAccess(Ident(a), Num(2)) `is incorrect, because you don't have in fact > a variable named `a` of an array type. > > Here the record access should take precedence over array access, i.e. > the AST should look like: > > ArrAccess(RecAccess(r, Ident(a)), Num(2)) Thanks. I eventually figured it out independently by working backward from the C code I wanted to generate. The compiler can now handle arbitrary combinations of records, arrays, and pointers. I spent a week jumping up and down and dancing. Wirl has now graduated from toy to fun toy :)