Lex and Yacc(Bison) in Windows

Posted on March 16, 2008. Filed under: Computers | Tags: , , , |

This post is for all those guys and babes out there who could’nt figure out how to compile their lex and yacc programs in windows. Students in my college install a whole Linux operating system to do their compiler lab practices. Why do it the geeky Linux way if it can be done under Windows? Also, why waste your hard disk space and time(for loading the Linux OS) to do such a simple task.

To begin with, you must download the files below first(around 400KB in total). All the files should be in the same directory(flex.exe is standalone but bison.exe is not).

http://www.monmouth.com/~wstreett/lex-yacc/flex.exe

http://www.monmouth.com/~wstreett/lex-yacc/bison.exe

http://www.monmouth.com/~wstreett/lex-yacc/bison.hairy (Sorry for the trouble guys!!! The link is now corrected)

http://www.monmouth.com/~wstreett/lex-yacc/bison.simple

Another requirement is that you must have a c/c++ compiler(like Turbo C++ ) installed in your system. I believe everyone who has reached compiler level programming will have a c/c++ compiler installed in their system(duh!).

Now you can start your work.

1. Create a lex program and save it(like ‘x.l’ or ‘x.txt’)

2. Reach your directory through command prompt.

3. Call flex by “flex <filename>” (eg: “flex x.l”)

4. If your lex input file doesnt have any errors, a file name “lex.yy.c” will be generated.

5. I suggest you rename “lex.yy.c” to some other more sensible name like “lex.c”, because double extensions is not a good idea in windows environment. Move the file to the folder of your compiler.

6 . Call the compiler and input lex.c to it (eg: “tcc lex.c”, where tcc is the Turbo C compiler; use any C/C++ compiler you have). If what you have is a more sophisticated environment like visual studio, you have to do the normal procedure to get a program to compile. If you use Turbo C, an object file “lex.obj’ and the executable “lex.exe” will be generated if there are no compilation problems

7. Thats it. Now just run lex.exe. Its your lexical analyser.

It is very similar to the way you do it in linux.

All the seven steps look like a complicated procedure. I created a batch file(.bat files similar to shell scrpits in linux) , to do the whole job from calling flex to get the lex.exe up and running. My batch file(rflex.bat) looks like below.

flex input.txt
ren lex.yy.c lex.c
copy lex.c f:\tc\bin\
f:
cd tc
cd bin
tcc lex.c
lex
i:
cd “Compiler lab”

del lex.yy.c
del lex.c

And i called this batch file from “i:\Compiler lab\” command prompt, the place where my flex .exe is stored. The path of my compiler is “f:\tc\bin\tcc.exe “. The batch file will get much smaller, if your compiler’s path is included in system paths or environmental paths or variables. By the way, your lexical analyser will stop after you press ctrl+z(^z character) and press enter(similar to ctrl+d in linux).

So you will have to modify the above batch file if want to use it in your environment. After successfully making the batch file all you have to do is make your input file and call the batch file from your flex and bison folder.

To do yacc or bison, you have to do a similar procedure. I leave that part to you. If you can’t figure it out, just post a comment requesting how to do it. I have successfully created a batch for that too. For more information, click the link below.

http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html

Advertisements

Make a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

45 Responses to “Lex and Yacc(Bison) in Windows”

RSS Feed for Jais’  Weblog Comments RSS Feed

Hi
I have just begun working with FLex and find that although my lex.yy.c file has been generated, upon renaming(nam.c )and compiling using Turbo C++ 3.0 I am confronted with the following linker error

Undefined symbol _yywrap in module nam.c

Is there a way out of this?

Hi
I have just started working with Flex and find that although lex.yy.c is being generated ,Renaming (nam.c) and compiling it with Turbo C 3.0 I am confronted with the following linker error
Undefined symbol _yywrap in module nam.c

Is there a way out of this?

After the generation of the lex.yy.c and after renaming to lex.c and compiling it with c compiler got the error of undefined reference to yywrap

I have downloaded files you said. I made the lex files to produce an .exe but in yacc files i get always errors. I procude the .c file by typing bison blabla.y but then i get errors the i dont declare yyerror and that kind of things. Could you please provide the commands i need to type in order to create an .exe ?

Thank you

A few of you seem to have the _yywrap problem. But I don’t know the cause of the problem. If you could send me your source lex/yacc file, i can try and check it out. But the last commenter seem to have got his lex source compiled.

And, John, i don’t know why you got that error. Try adding these lines before the main

yyerror (char *s)
{
fprintf (stderr, “%s\n”, s);
}

I got all my source files compiled to exe’s , i don’t know why you guys are having trouble.

Hi, my name is Joe Garvey, a mature student in Cork University College, Ireland. I must consider using flex and bison in a college project. I’ve downloaded the flex.exe and bison.exe and the bison.simple- but when I try to download (save target as) bison.hairy it saves automatically as bison.simple Any idea as to what if any suffix I should force on the bison.hairy to get it usefully downloaded. This system here is an intel duo core Dell with Windows Vista Business onboard. Do you know of any issues with the Vista consideration? I believe I have a DJGPP compiler onboard here, working, and before I travel headlong into setting this lot up, it would be nice to know of any Vista issues (there have been so many!). Kind regards, and many thanks for your clear and useful webpage etc. Joe.

Joe and all the guys who read this,

Sorry for a late reply to your query, as a matter of fact i haven’t logged in to this world for a long time for some reasons.

I am sooooooooooo sooooorrrrrrrrrrryyyyyyyyyy for my stuuuuupid mistake. I linked the file wrong in this post(bison.hairy). That was the problem everyone was having, and i was trying to find out the mistake by the files i had downloaded correctly before this post :D.

Please re-download bison.hairy and try.

Hello,

So I have the file lex.yy.c and it works fine. But I have absolutely no idea how to proceed with Bison. Could you possibly describe the procedure for Bison like you’ve done with Flex?

Awesome man. This will give me yet another reason to delay installing Linux on my PC:)

Hi,
>>
I am confronted with the following linker error: Undefined symbol _yywrap in module nam.c
Is there a way out of this?
<<
Yes, there’s simple way out of this.
Write your yywrap() function
OR
Just put
%option noyywrap
in your flex source file.
-Damodar

I would be hesitent downloading .exe files. Moreover this version of bison and lex is quite old, and does not support c++ interface. Does anyone know how to build bison under windows e.g. VS and not under cygwin?

I have been using it fairly well under Boreland TC++ 3.0. And not cygwin. I haven’t used it under VC or VS.

hi,
i follow your instruction but when i compile it some link error occur.what can i do for it?

I tried every link and none of them are working!!!

It seems that the site owners have removed the links to the files.

the links are broken

It seems may of you meets the following linker error:

lex.yy.obj : error LNK2019: unresolved external symbol _yywrap referenced in fun
ction _yylex

this is why the .l file doesn´t supply a version of yywrap()
try to type:

%option noyywrap

at the beginning of the .l file (in the definitios part)

hi,
i have a question.how do run bison.exe? is that the same way of running flex.exe. if so then how do we parse the input. do we need to run the exe file generated by flex and bison together or first do we need to run exe file generated by flex or bison. how does it works. can anyone give me detailed steps to run this exe as parser. expecting your reply at the earliest. thanks..

Raj,

it seems you have mixed up the way flex and bison work. actually they DO NOT return any exe file, but c source files, to be after compiled and linked together with the rest of your code.

here comes general steps to follow:

1)you have written two files:
lexer.l containing your lexical rules
parser.y containing gramar rules

2)run flex.exe by typing
flex.exe lexer.l
you´ll get a file called lex.yy.c

3)after you run bison
bison -d -o y.tab.c parser.y
and you will get the file y.tab.c and the corresponding header file y.tab.h
please note that i used the “-o” option to call the output y.tab.c

4)you compile and link your main.c and the files you got. with msvc you tipe:
cl lex.yy.c y.tab.c main.c /Femain.exe /DMSDOS

/Fe is an option to call the output main.exe
/DMSDOS is an option to define the macro MSDOS which is essential to don´t have error

have funn!
Pier

Hey I can do LEX prog with this but I’ve prob with Yacc(Bison).

From cmd I executed “yacc -d calc.txt” & “lex cal.txt” & 3 files name “calc.txt_tab.c” also header file & lex.yy.c are created.

But How to run them in XP with TurboC & cmd.
Like in Linux the command is gcc calc.tab.c lex.yy.c -ly -ll
& then ./a.out.
How to do with XP?…plz rpl.

hey can you send me a sample lex program that i can use to test? if the compiler and flex perfectly works.. because the compiler gives me an “declaration syntax error” while compiling for the program starts with %{.. so kindly help 🙂

This post is written long time back. I don’t even remember how to write lex code.

Hi… the hairy link is not working

I get this error… Undefine symbol _main in module c0.ASM… Pls tell me how to correct it…

I got an error message while running the program through compiler unresolved external symbol _yylex

plz tell me clearly how to compile yaac

plz tell me clearly how to compile yaac program

plz give a sample program for yacc

download bison.zip from here it works..

http://userpages.monmouth.com/~wstreett/lex-yacc/lex-yacc.html

will dev-c++ work for this??i mean im not able to install turbo-c++ so im using dev…
and do u ve ab solution for this??windows 7 64-bit m/c ,not able to find an appropriate turbo-c..

thanks a lot
Even i thought y shud i install a whole new OS for just 2-3 assignments

Hi.
I’ve lost my old compiler flex. I’ve download it from this page. My Error is :
flex.exe : input rules are too complicated. I had before a file named flex254a.exe. I dont find this. May you Help me. Thanks

Hi,
I have done what procedure you have told , but when I compile lex.yy.c in turbo C ,it gives me error “UNABLE TO OPEN INCLUDE FILE blablah.h”

With Flex in windows i get the folowing error flex : input rules are too complicated = 32000 NFA: Can You Help Me?
Thanks.

thank you so much it helped me lot…

I am getting the following error:

Error 1 error LNK2001: unresolved external symbol _yylval G:\PROJ\lex.yy.obj

Sir, I Have “Borland Turbo C++ 4.5” installed on my system, then how to execute the lex file through command prompt?please do answer!

Thanks you Sir.
You saved my day!

hi,
i have downloaded all those file which u have been posted,after then i kept in seperate folder named “lex” in C Directory.
i went cmd prompt in that i entered like below c:\lex>”flex x.l”
and i kept sample program namely X.l in that same folder..but i did’t get any thing..simply it tells command is not recognised. i’m using windows7

very good help file but my program said cant opne the file , what i have to do ? i run it windows 7

Also try the Tiny C Compiler together with Bison/flex.
Great tips! Nice blog.

its good………………..its working….thanks

am getting a error as “flex cant open file”…any solution..

‘tcc’ is not recognized as an internal or external command,
operable program or batch file.
i’m gettin this error help me out

tcc is turbo c compiler…you have to install turbo c++ first to run tcc


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d bloggers like this: