Recommended reading
Flex bison libtool make gcc-core gdb ddd ctags colorgcc gperf libisl-devel libisl-doc libmpfr-devel libmpc-devel libmpc-doc libgmp-devel libgmp-doc binutils automake autoconf autoconf2.5 automake1.15 libcairomm1.01-devel libcairomm1.01-doc libcairomm1.01 libelf-devel libncurses-devel aspell-en enscript less source-highlight ghostscript gv. Build DJGPP cross compiler and binutils on Windows (MinGW/Cygwin), Mac OSX and Linux - andrewwutw/build-djgpp. Apr 28, 2020 Installation of Flex and Bison in Ubuntu. Open a terminal by pressing CTRL + ALT + T. Then, type one of the the following commands: This command is more basic: sudo apt-get update. Sudo apt-get upgrade. Sudo apt-get install flex bison. This command is a bit more specific: sudo apt-get update. Mar 28, 2011 flex-2.5.4a-1.exe. After that, do a full install in a directory of your preference without spaces in the name. I suggest C: GnuWin32. Do not install it in the default (C: Program Files (x86) GnuWin32) because bison has problems with spaces in directory names, not to say parenthesis. Installing LEX/YACC or flex/bison on Windows, Visual C 2008. You should be able to get flex and bison as part of cygwin, then reference them in visual studio.
- flex & bison: Text Processing Toolsby John Levine.LookInside
Affiliate disclosure: we get a small commission for purchases made through the above links
This is part two of a series explaining how to convert example lex and yacc code from Lex & Yaccby Levine, Mason and Brown [1] to work on modern systems using flex and bison.Part one looked at compiling on a modern Linux system.This page explains how we made it compile without error on our Windows 7 system using Microsoft Visual Studio 2008 (MSVC++9).Note: This page is a bit out of date now, being written for MSVC 2008. See the note on Update for MSVC 2010+ below.
Most solutions we've seen for MSVC involve processing the flex and bison files on a Linux system like Cygwin and then copying the resulting .c and .h files across to MSVC to be compiled. Our solution here lets you put your .l (or .flex) and .y files directly into your MSVC project folder, edit them at will, and then process and compile it all with a single click.
YMMV. No doubt there are alternative and better ways to do it. Please let us know your suggestions.
Contents
- Setting up flex and bison on Windows - a one-off
- Add Custom Build Rules for flex and bison files - another one-off
Setting up flex and bison on Windows
Old instructions (superseded)
- Download and install the latest GNU binaries for Windows:
- Flex for Windows.
- Bison for Windows.
- In each case download the 'Setup' file for the 'Complete package, except sources'. As at March 2013, these should be
flex-2.5.4a-1.exe
(1.2 MB) andbison-2.4.1-setup.exe
(3.7 MB). These files have not been updated for a while.
- Important: Install these packages in the new folder
C:GnuWin32
, not the default folder with 'Program Files' in the name. You must not have any spaces in the installation folder name or you will have problems. So when the setup program asks for the installation folder name, you must change it to a name without spaces. We suggestC:GnuWin32
.
A new and better download
- Download the latest Win flex-bison package from sourceforge
win_flex_bison-latest.zip
. The version we downloaded (648 kB, last updated 2013-11-22) containedwin_flex
version 2.5.37 andwin_bison
version 2.7. - Unzip and copy the whole folder somewhere convenient. Do not store in a folder with spaces in the path.We use
C:GnuWin32win_flex_bison
. Make sure you include the subdirectorydata
which includes them4sugar
stuff.
Create a new project in MSVC++
- In Microsoft Visual Studio create a new project: Visual C++ > Win32 > Win32 Console Application.
- Select the minimum application settings: Console application and Empty project.
We will make some more changes to the configuration properties below after we've added our files.First we must do a one-off and add the custom build rules for flex and bison files.
Add Custom Build Rules for flex and bison files
You only need to do this step once and it is set for all subsequent projects.
- Right-click on the project in the Solution Explorer and select Custom Build Rules...
- Click on New Rule File..
Set:
- Display Name to
Flex and Bison Tools
- File Name to
FlexBison.rules
- and enter a Directory whichyou know will be backed up and be available for future projects.
We will use this 'rules' file in all our flex and bison projects.Save this file by clicking OK and then edit it again using Modify Rule File.
- Display Name to
- Add two build rules using Add Build Rule, one for Bison and one for Flex. Important: You should add Bison first.
The important entries for Bison are:
- Name =
Bison
- Command Line =
C:GnuWin32binbison.exe -d -v -b y $(InputPath)
- Command Line =
C:GnuWin32win_flex_bisonwin_bison.exe -d -v -b y $(InputPath)
- File Extensions =
*.y
- Outputs =
y.tab.c,y.tab.h
The important entries for Flex are:
- Name =
Flex
- Command Line =
C:GnuWin32binflex.exe $(InputPath)
- Command Line =
C:GnuWin32win_flex_bisonwin_flex.exe --wincompat $(InputPath)
- File Extensions =
*.l;*.flex
- Outputs =
lex.yy.c
Note the
--wincompat
option for win_flex. - Name =
- Save all your changes. You should have Custom Build Rule Files that look like this for 'Flex and Bison Tools':
More changes to the Configuration Properties
You need to make these changes for every project.
- Make sure the General Configuration Properties have Character Set =
Not Set
.We want to use the ANSI/ASCII character set, not Unicode. - Go to the C++ Preprocessor screen (Configuration Properties > C/C++ > Preprocessor)and add the Preprocessor Definitions
_CRT_SECURE_NO_DEPRECATE
and_CRT_NONSTDC_NO_DEPRECATE
.These avoid more annoying but irrelevant warning messages from MSVC. Incidentally, you can do most of this setup as default: seeMSVC++: Getting rid of that _CRT_SECURE_NO_DEPRECATE warning.
- Go to the C++ Advanced Properties screen (Configuration Properties > C/C++ > Advanced) and set Compile As =
Compile as C Code (/TC)
and Disable Specific Warnings =4102
.The 4102 warning we disable is caused by the automatically-generated code [
The label is defined but never referenced
].This is generally one of those warnings you can safely disable without fear of hiding any real errors you might make in your code.Update December 2013: The 4102 warning does not seem to happen with the new win_flex and win_bison.Instead we get [warning C4715: 'lookup' : not all control paths return a value
].If you wish, you can change the 4102 above to4715
to suppress this message, but be aware that this is not such a safe warning to turn off! - Go to the Linker Input screen (Configuration Properties > Linker > Input)and set Additional Dependencies =
C:GnuWIn32liblibfl.a C:GnuWIn32libliby.a
. Use a space as separator between the two entries.Update December 2013:This step is probably unnecessary with the latest win_flex and win_bison, providing you provide your ownmain()
andyyerror()
functions, which you should do anyway.And you can avoid providing ayywrap()
function by setting%option noyywrap
in your flex file.These library files (they are named '.a' but behave like '.lib' files) provide very minimal default functions.The library
libfl.a
providesyywrap()
andmain()
,andliby.a
providesyyerror()
and its own version ofmain()
.In practice, you are probably better off providing your own versions.If you provide your own functions, you don't need to refer to these two libraries.
Add two wrapper files to your project
Add these two one-liner wrapper files wrapper-flex.c and wrapper-bison.c to your project. Moborobo for mac.
These make it easier to handle the frequently-changing lex.yy.c
and y.tab.c
files.Note this relies on bison using the '-b y' option (see the note below).The disadvantage of this technique is that you must always keep each set of project files in separate folders.
Add the .l and .y files to your project and compile it
Finally, we can add our flex and bison files to the MSVC project.In this case we add our modified ch3-03.l and ch3-03.y files and flex_memory_fix.h(zipped files here, 2 kB).When we add these files, with the .l and .y extensions, MSVC should prompt us to use the FlexBison.rules
Jbl serial number. custom build rules we made earlier.
Keep all these files (ch3-03.l, ch3-03.y, flex_memory_fix.h, wrapper-bison.c, wrapper-flex.c
) in the same project folder.The files (lex.yy.c, y.output, y.tab.c, y.tab.h
) are created automatically, so don't mess with them.
flex_memory_fix.h
is no longer needed with the latest version of win_bison.If all has gone correctly, you should be able to compile this project. (It might take two goes the first time.)On our VS2008 system, we get this output:
Note the 'Running bison' and 'Running flex' lines in the output. These are the values in 'Execution Description' we set when we created the build rules. Note it is important that bison runs first before flex.
A note about the '-b y' option for bison
The -b y
option we set for win_bison makes sure the names of the output filesare always y.tab.h
and y.tab.c
(instead of foo.tab.h
where foo.y
is the name of yourbison file). This is convenient for us in the setup above. However, you may need to change your flex foo.l
file if it refersto a file like foo.tab.h
and make that y.tab.h
A final twist for C++ and unistd.h
There is one more twist to all the above if you actually want to compile C++ code with flex and bison (as opposed to C code with the /TC option).If you change the C/C++ > Advanced > Compile As option back to Compile as C++ Code (/TP),then you will run into problems where the automatically-generated source code looks for but cannot find unistd.h
.
As far as we know, this include file is not available in MSVC/Windows. A copy that works on Windows is in the GNU folder C:GnuWin32include
. One fix is toadd C:GnuWin32include
to the VC++ Directories Include Files in Tools > Options > Projects and Solutions.
References
- [1]Levine, John, Tony Mason, and Doug Brown. Lex & Yacc, 2nd Edition, O'Reilly, 1992
- [2]Levine, John.Flex & Bison: Text Processing Tools, O'Reilly, 2009
Comments by the winflexbison project owner
Hello everyone!
I've just seen your article athttps://www.di-mgt.com.au/flex_and_bison_in_msvc.htmland have two comments.
First of all I'm owner of the winflexbison project at sourceforge andglad to see my project is useful for you.
- At the end of the article you noted about 'unistd.h' include problem. Ithought I resoled this problem with '--wincompat' key. You can see littleexplanation in UNISTD_ERROR.readme file in win_flex_bison root folder. Ifthere is still problems with 'unistd.h' include, please let me know - itshould be fixed.
- Also you noted about warning C4715 'not all control paths return avalue' in generated source files. I think I should fix it too.
Hi Alex,Great to hear from you. Your project is really good.
Some of the comments on the page refer to my attempts with the earlier version. I think the unistd.h problem related to that. To be honest I do everything in plain ANSI C, and never use the C++ options, so I wouldn't have noticed the effect of using the --wincompat option on the new version. I'll fix up the comment in due course. Our ISP is moving the site over to a new server at the moment and taking their time over it, so we cannot make any changes for the time being.
The other warning about control paths is mildly irritating, and as a rule I don't like turning off warnings. If you could fix it it would be great. But it's not critical.
The product is really great. Please keep up the good work.
Recently I was asked to add custom build rules for VS2010 and upper to winflexbison package (see http://sourceforge.net/p/winflexbison/discussion/general/thread/6c305702). So you can use those ruleset if you will migrate from VS2008.
During creation rules I've noticed a little problem with invoking win_flex.exe or win_bison.exe tools from VS build system. May be you will be interested. The invoking working directory is not the same as *.y or *.l files placed in. So generated C code have #line directives with absolute paths to source grammar file. It can be critical if you place generated files under version control system and on different machines you have different paths.
I hope I describe the problem more or less clear. To fix it I had to change simple invoke command like:
to more magic one:
This will setup correct working directory and #line directives will be relative then.Though for learning purposes this is not so critical.Best wishes,
Bison Flex Tutorial
Contact
To comment on this page or to contact us, please send us a message.If you send us a relevant comment for this page, we'll post it here. Just mention 'flex_and_bison_in_msvc
' in your message.
Install Bison Flex Cygwin 2
This page first published 22 March 2013. Last updated 30 June 2020.