Multiple scanners on same input file using lex/flex

Hi all,

I'm working with flex (version 2.5.4a) on GNU/linux. I used it to develop 4 scanner C files for matching different patterns within an input file. But the problem now on my hand is that I need to conditionally combine these. That is in main (placed in a separate C file other than the 4 scanner files) I'll have check the options provided by the user and accordingly call the scanner functions from the scanner C files.
For ex. if main is in file app.c and options are:
-f - for scanner function of 1st scanner file
-s - for scanner function of 2nd scanner file
-t - for scanner function of 3rd scanner file
-r - for scanner function of 4th scanner file
so something like './app -f -s -r filename' would mean that the scanners from 1st, 2nd and 4th file are called while 3rd's is not called.

The problem with such a situation is that when lex is invoked it generates C file with scanner function yylex() (and supporting functions for it). Now this function has same signature in all 4 scanners and hence the inclusion of all 4 files causes name conflict ("error: yylex() redifned here". Even -P option does not help as it just #define s the original function).

Now I hope everybody must be understanding my difficulty. Is there any way out (without changing to C++)?
While I'll like a functional decomposition as stated above but even if someone can come up with a solution where I need to combine all lex files to one and still be able to control what pattern are to be matched according to the switch provided by user in 'main()' will be a great help.

Thanks in advance!

What's wrong with the -P option? The preprocessor can rename it as much as anything else can.

No Corona688, that wont work because -Pprefix just #define's the original function (like -Pfirst would do '#define yylex firstlex') which would be expanded by preprocessor before compilation itself so while compiling the complier will complain that the function (yylex) has been redefined (because now there are 4 scanner functions from our 4 files expanded to yylex). And in fact not just yylex there are many other supporting functions and global variables that are #define'd this way & get expanded before compilation genrating a lot of errors.
Now can someone tell me way out?

You have four lex-generated files - go intothose files and mark all of the functions in them static - this makes their scope local to the C file they live in. Next create a wrapper function that is NOT static.
in file1.c create scanner1() which calls the yylex function or whatever entrypoint you have defined. Create scanner2(), scanner3() and scanner4() in each of ther other files. In the main block, have for extern declarations for scanner1() scanner2() etc.

ld will hide the fact that each of those four modules has functions all named the same:

cc main.c file1.c file2.c file3.c file4.c -o scanmain

Assuming I understood your problem.... I didn't get your first problem very clearly either.

Could you post the errors from this? They might be solvable. The #define would NOT expand firstlex to yylex, quite the opposite -- the preprocessor would do a literal search and replace of yylex to firstlex. The -P method ought to work, that's what it's there for.

Jim's method would also work, but has the disadvantage of needing to hand-edit the .c files every time they're regenerated.

Thanks Corona688 and thanks jim. :slight_smile: Though late but I must thank you both.
I really interpreted the errors wrongly (a real silly but grave mistake). The errors were there for I was linking by #including files which I should not have and that confused me. Any way I got the things right after getting the mistakes.

Thanks again for your help.