This is the source of the BSD version of yacc that is distributed in the NET2 release of BSD Unix. We chose this over Bison due to the bison license agreement. And if you are scratching you head over that comment, read the addendum in the xxx-info-1 file that comes with bison. Anyway, this BSD-yacc has been hacked on to make it generate an all-static parser C program so that it may be used on an IOC w/o getting things confused. They way we intend to use it is with the epics-hacked version of flex that also generates an all-static source program. The general idea is that your yacc source (xxx.y) file could be formatted like this: ========================================================= %% YOUR YACC PROGRAM %% int MyYaccParser(char *f1) { static int FirstFlag = 1; printf("processing file >%s<\n", f1); yyin = fopen(f1, "r"); if (!FirstFlag) yyrestart(yyin); FirstFlag = 0; yyparse(); fclose(yyin); return(0); } static int yyerror(char *str) { printf("Error: %s\n", str); return(0); } ========================================================= The FirstFlag and yyrestart jazz is the flex-flavored version of how you restart the scanner if you want to parse another file. Without it, the scanner can only be used one time. Even if you think your code will only be used one time, it is desireable to put in the restart stuff anyway, because some day you (or your boss) will change your mind and without it the IOC will crash when you make your second call to your parser. Note also that there is a yyerror function present. This is mandatory for the way we are using flex. Without, results are indeterminate... because you will end up calling some other random yyerror() in the ioc.. probably the one for the console command interpreter. --John