The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
Google UNIX.COM


High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Multiple input field Separators in awk. kinksville Shell Programming and Scripting 4 04-25-2008 02:12 PM
flexible sed command needed to handle multiple input types SiftinDotCom Shell Programming and Scripting 2 03-19-2008 01:39 PM
multiple input search and replace script tungaw2004 UNIX for Dummies Questions & Answers 3 04-29-2007 04:59 AM
Can Xargs execute multiple commands of evry input file nilesrex Shell Programming and Scripting 4 08-30-2006 05:39 AM
can you redirect multiple files for input? Matrix_Prime UNIX for Dummies Questions & Answers 4 02-27-2005 04:07 PM

Reply
 
Submit Tools LinkBack Thread Tools Display Modes
  #1  
Old 10-25-2006
Rakesh Ranjan's Avatar
Registered User
 

Join Date: Aug 2005
Location: India
Posts: 40
Question 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!
Reply With Quote
Forum Sponsor
  #2  
Old 10-25-2006
Registered User
 

Join Date: Aug 2005
Location: Saskatchewan
Posts: 979
What's wrong with the -P option? The preprocessor can rename it as much as anything else can.
Reply With Quote
  #3  
Old 10-25-2006
Rakesh Ranjan's Avatar
Registered User
 

Join Date: Aug 2005
Location: India
Posts: 40
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?
Reply With Quote
  #4  
Old 10-26-2006
...@...
 

Join Date: Feb 2004
Location: NM
Posts: 4,274
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:
Code:
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.
Reply With Quote
  #5  
Old 10-26-2006
Registered User
 

Join Date: Aug 2005
Location: Saskatchewan
Posts: 979
Quote:
Originally Posted by Rakesh Ranjan
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).
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.
Reply With Quote
  #6  
Old 12-08-2006
Rakesh Ranjan's Avatar
Registered User
 

Join Date: Aug 2005
Location: India
Posts: 40
Thanks Corona688 and thanks jim. 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.
Reply With Quote
Google The UNIX and Linux Forums
Reply

Tags
linux

Thread Tools
Display Modes




All times are GMT -7. The time now is 07:36 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008. All Rights Reserved.Ad Management by RedTyger Visit The Complex Event Processing Blog

Content Relevant URLs by vBSEO 3.2.0