From: John P. H. <jph...@gm...> - 2013-11-01 14:36:05
|
BEGIN is a flex macro to set the scanner start state. Changing the flex state from the parser is frowned upon in some circles, but that is what your yacc does. So you need to imbed the flex generated code before the parser. (Defining the macro won't buy you anything for it sets a static variable in the flexx-generated C code.) You might look into flex' exclusive start states (%x ctxn rather than %s ctxn--lex only has the %s variety); they are likely to simplify your flexer. On 11/01/2013 02:36 PM, Mark Hounschell wrote: > I am trying to port some code from an old unix box to Linux. It is a > microcode compiler for an old CPU board. This code uses lex/yacc/cc. > Obviously all works on this old unix box. I am completely lex/yacc > ignorant but am not gcc ignorant. I am hoping someone can give me some > advise as to what I need to do. > I've subscribed and sent this email to both the flex-help and the > help-bison mailing lists because I really have no idea what the problem > really is. I hope that is appropiate. > > The Linux distribution OS is OpenSuSE-12.3 and the software versions in > use are: > > gcc-4.7-7.1.1.i586 > glibc-2.17-4.7.1.i586 > flex-2.5.37-2.1.1.i586 > bison-2.6.5-2.1.1.i586 > > > The actual error I get from gcc when compiling this stuff on Linux is: > > # make > ./translate5 cpu.def > cat yacc1.yinit yacctoks yacc2.yinit yaccrules yacc3.yinit > yacc.in > yacc -d yacc.in > cat lex1.linit lextext lexfield lex2.linit > lex.in > flex -l lex.in > gcc -ansi -w y.tab.c -o cpu.asm -lgcc > yacc.in: In function ëyyparseí: > yacc.in:2322:3: error: unknown type name ëBEGINí > make: *** [cpu.asm] Error 1 > > This is the output from the legacy "unix" machine: > > # make > translate5 cpu.def > cat yacc1.yinit yacctoks yacc2.yinit yaccrules yacc3.yinit > yacc.in > /usr/bin/yacc -d yacc.in > cat lex1.linit lextext lexfield lex2.linit > lex.in > /usr/bin/lex lex.in > 2277/3600 nodes(%e), 10911/17500 positions(%p), 1561/1900 (%n), 89797 > transitions > , 136/170 packed char classes(%k), 3614/5000 packed transitions(%a), > 2433/4000 output slots(%o) > /bin/cc -z -B/lib/ -t0 y.tab.c -ly -ll -v -w -o cpu.asm > /lib/cpp y.tab.c /tmp/ctm030464 -DON_SEL -Dselport -DGOULD_PN -DCOFF > /lib/ccom /tmp/ctm030464 /tmp/ctm030463 -Xll -w > /bin/as -o y.tab.o /tmp/ctm030463 > /bin/ld -X /lib/crt0.o -e start -o cpu.asm -z y.tab.o -ly -ll -lc > > Now from my limited mis/understanding the ëBEGINí in the compile failure > above seems to be a "lex thing"? Yet it seems to appear in a yacc file? > If I look at what ends up being in the y.tab.c file on both machines I see: > > Legacy unix box: > > case 207: > # line 2305 "yacc.in" > { if (yychar != -1) { > yyclearin; > while (yyleng > 0) { > unput(yytext[--yyleng]); }} > BEGIN ctxn;} break; > } > goto yystack; /* stack new state and value */ > > } > > The Linux box: > > case 208: > /* Line 1778 of yacc.c */ > #line 2318 "yacc.in" > { if (yychar != -1) { > yyclearin; > while (yyleng > 0) { > unput(yytext[--yyleng]); }} > BEGIN ctxn;} > > break; > > Both the above come from the yacc3.yinit file. > > cnum : /*empty*/ > { if (yychar != -1) { > yyclearin; > while (yyleng > 0) { > unput(yytext[--yyleng]); }} > BEGIN ctxn;} > ; > > > The only references to "ctxn" I find are from a lex1.linit and > lex2.linit files. > > lex1.linit: > > %C > > > %e 3600 > > %p 17500 > > %a 5000 > > %o 4000 > %n 1900 > > %k 170 > > > > int statnum=0; > int externum=0; > int passc=0; > int linec=1; > int errc=0; > int eolflag = 0; > int codeflag = 0; > int lque = 0; > int plinec = 0; > int spacec = 1; > int pagesize = 55; > int skippage = 0; > int skipline = 0; > int pagecnt = 1; > > int type1, type2, type3, type4, type5, type6, type7, type8; > > int type9, typeA, typeB, typeC, typeD, typeE, typeF; > > > %S ex co pb lc rz bd al eq va code > > %S rz2 bd2 sp hd hd2 hd3 hd4 dir ctxn > . > . > . > . > > > lex2.linit: > > <code,ctxn>("#"[0-9a-fA-F]+|[0-9]+) { > if (yytext[0] == '#') { > yylval.nvaltype.nval=htoi(yytext); > if (yyleng > 9) > fprintf(stderr, "Literal value '%s' out of > range at line %d\n", > yytext, linec); > } else > yylval.nvaltype.nval=atoi(yytext); > > yylval.nvaltype.ntype=2; > BEGIN code; > return(NUM); > } > > <code>[ \t] {} > > ^[ \t]+ {BEGIN code;} > > <ctxn,code>[A-Za-z][\$\.A-Za-z0-9]* {BEGIN code; return(p_symbol(yytext));} > > <code>\n {p_eol(); ++linec;} > > [ ,\t] {} > \n {p_eol(); ++linec;BEGIN 0;} > . {return(YYERRCODE);} > > > %% > > #include "process.c" > > > Again, I am completely ignorant of lex and yac. Very strange and cryptic > looking code. I would greatly appreciate any pointers from anyone. > > Thanks in advance > Regards > Mark |