From: "Christopher Nelson" To: Subject: Re: Bison and particular expressions. Date: Thu, 24 Jun 1999 11:54:59 -0600 Message-ID: <01bebe6a$ad62d9a0$LocalHost@thendren> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 4.71.1712.3 X-MimeOLE: Produced By Microsoft MimeOLE V4.71.1712.3 Reply-To: djgpp AT delorie DOT com .. sorry, i didn't see this mesage at first. :-) >int a,b,c; >int main(int a, b c, d e); > >Each line is syntactically correct by itself (assuming 'b' & 'd' are >defined types for line #2). The problem is, my bison program looks for >"type id, id," and when it hits the main line, it gets a parse error >because 'c' is not a comma. If you really want to look at the whole >code, ask and I'll post it. But, I think this small program illustrates >the problem. > >%% >file: >| file star >| file and >; > >starB: '*'; > >andB: '&'; > >equalB: '='; > >commaB: ','; > >star: starB >| starB and >| starB andB commaB >; ^^^^ this is what i was talking about in my other e-mail. the longest should go first, unless you're using recursion. >and: andB commaB >; the proper way to have a list of this type is to do the following: listitem: item | listitem ',' item ; listofitems: listitem ; in addition, it is partially a lexical problem. c is a very complex language to parse specifically because of typedef's and some special-case problems. one part of what you should do is have the lexical-analyzer understand id contexts. that way you can write the recursive list like this: parameteritem: typedefid id | class id /* class=int,float,short, etc. */ | id ; parameterlist: parameteritem | parameterlist ',' parameteritem ; functiondec: typedefid id '(' parameterlist ')' | class id '(' paramterlist ')' ; the lexical analyzer in this case would do the following: {ID} res=findid(yytext); if (is_typedef(res)) return(typedefid); else return(id); you can extend this to include different types of variables, structures, etc. this is the way that most clean compilers implement the problem of context. there is an excellent c-grammar that has very few reduce-reduce and shift-reduce problems in it, and it would probably be good to look at it. unfortunately, i've forgotten it's name. it's something like Roseburg or Rosen or something. :-) in any case, this is how he chose to resolve the problem of type-def's. -={C}=-