From: eklaus AT erols DOT com (Programmed to death) Newsgroups: comp.os.msdos.djgpp Subject: HELP: Bison, Flex & C++ class support... Date: Thu, 17 Apr 1997 06:27:02 GMT Organization: Erol's Internet Services Lines: 103 Message-ID: <3355bec7.44451742@news.erols.com> NNTP-Posting-Host: spg-as4s30.erols.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk I currently have simple bison and flex files working( listed below ) I made them just to test one thing. I want to be able use c++ classes in both the lexer and the parser, and possibly pass objects of a particular class back and forth between the two. When i overide the .c extensions for lexyy.c and y_tab.c and compile everything as c++ code, errors pop up that were not present when compiling the files as c-code. I used the following batch file: bison -y -d -t -v cplus.y flex -I cplus.l gxx -o cplus.exe -x c++ y_tab.c lexyy.c -lfl -lgpp -lm -lpc and got the following errors: bison.simple: In function `int yyparse()': bison.simple:377: warning: implicit declaration of function `int yylex(...)' cplus.lex: In function `int yylex()': cplus.lex:21: warning: implicit declaration of function `int yyerror(...)' d:/langs/djgpp/tmp\ccdaaaaa(.text+0x4b5):y_tab.cc: undefined reference to `yylex' d:/langs/djgpp/tmp\cceaaaaa(.text+0x247):lexyy.cc: undefined reference to `yyerror' The LEXER( cplus.l ) is listed below: %{ #include "y_tab.h" %} eol \n delim [ \t\n] ws {delim}+ letter [A-Za-z] letters {letter}+ digit [0-9] digits {digit}+ %% {eol} { return( EOL );} ({letters}|{digits})* { sprintf( yylval.str, "%s", yytext ); return( STRING ); } . { yyerror( yytext );} %% The PARSER( cplus.y ) is listed below: %{ #include #include #include //#include int yyerror( char str[50] ); int main(); %} %union { char str[50]; } %token STRING %token EOL %type STRING string line %% input: { printf("\n\n ** START ** \n"); } | input line { printf("\n\n ** FINISHED: %s", $2 ); YYABORT; } ; line: EOL { strcpy( $$, "\n"); } | string EOL { strcat( $$, "\n"); } ; string: STRING { strcpy( $$, $1); } | STRING string { strcat( $$, $2 ); } ; %% int yyerror( char *str ) { printf("\nERROR: %s\n", str ); } int main() { yyparse(); }