bison(windows下bison的安装与入门)
一、如何在Windows下面使用bison
1、到Google搜索“bison
windows”,应该可以看到这个网站:
它是专门将GNU的工具移植到windows下的工程。
2、下载下面的内容:
执行程序:
需要的链接库:
3、我是这么安装的:
我在D盘下有一个d:\local的目录,它的目录结构如下
local
├─bin(存放可执行程序,这个目录在环境变量PATH上)
├─games
(哈哈)
├─include(我Dev-CPP的一些附加头文件目录)
├─lib(同上)
├─share
(存放GNU工具的共享文档)
└─tmp(临时文件)
安装的时候,将[bison-bin.zip\bin\]下的bison.exe和m4.exe文件存放到bin目录下
将[bison-bin.zip\share\]内容全部拷贝到share下面。
将[bison-dep.zip\bin\]下的两个动态链接库拷贝到bin目录下。我开始就是忘了这两个东西,然后命令行下执行程序的时候,也不见报错,就是没有任何的反应。还以为自己的问题出在那里
二、bison是什么意思
bison的意思:野牛
双语例句:
1、Thusonesimplefact,achangeinthenumberofbison.这样一个简单的事实,野牛数量的变化。
2、Bisonwastenolongerfellonthegroundtoimprovethesoil.野牛制造的废物也不再渗进泥土改善土壤了。
3、onewrongstepandthebisoncouldkillJeff.只要出一点错野牛就会杀死杰夫。
4、Thebisonwillnotstaylongamongthetrees.野牛不会在林中栖息过。
5、Thebisonformadefensivecirclearoundtheiryoung.野牛们以幼崽为中心组成防御性外围。
6、TheefficientminortemplateenginebasedonFLEXandBISONisdesigned.提出了一种基于FLEX和BISON的高效模板引擎的设计方法。
三、如何兼容bison2.3和bison3.0.4版本
假设有一个工程,采用autoconf来进行编译。对于不同版本的bison,弄清楚其差异化点,对于bison2.3和bison3.0.4来说明,主要在于代码段引用的方式不一样,bison2.3版本的句法文件MySampleParser.yy如下:
%{
#include<stdio.h>
#include<string>
#include<limits.h>
#include<ot/ common.h>
BEGIN_OT_NAMESPACE(DSP);
MySampleScanner类
END_OT_NAMESPACE(DSP);
...
%}
在的Makefile.am里面,需要添加:
AM_YFLAGS=-d
AM_LFLAGS=-olex.yy.c
noinst_LTLIBRARIES= libmysample_scanner.la
libmysample_scanner_la_SOURCES= MySampleParser.yy MySampleScanner.ll
CLEANFILES= MySampleParser.hh\
MySampleParser.cc\
stack.hh\
position.hh\
location.hh
值得注意的是,在MySampleParser.yy文件中,BEGIN_OT_NAMESPACE不会被C++编译器编译执行,所以使用automake解析的时候会出现找不到命名空间ot的情况,这个时候需要在MySampleScanner.ll文件的代码段中添加命名空间,如:
%{
命名空间
{
}
#include<string>
...
%}
当然MySampleScanner.h头文件一般不是自动生成,需要构造类MySampleScanner,且继承yyFlexLexer,但由于符号冲突的问题,需要在定义类MySampleScanner之前,对yyFlexLexer重新定义,像这样:
#ifndef __FLEX_LEXER_H
#define yyFlexLexer QueryFlexLexer
#include<FlexLexer.h>
#undef yyFlexLexer
#万一
但对于bison3.0.4版本来说,代码段的表达方式发生了变化,需要采用如下
%代码需要{
#include<stdio.h>
#include<string>
#include<limits.h>
#include<ot/ common.h>
BEGIN_OT_NAMESPACE(DSP);
MySampleScanner类
END_OT_NAMESPACE(DSP);
...
}
了解到区别之后,如果需要兼容,应该怎么办呢首先要获取到?野牛版本才能做下一步策略:
在的configure.ac里面(如果有M4的宏文件,也可以放置在M4文件中)添加:
dnl-------------------------------------------------------------------------
dnl检查野牛版本
dnl-------------------------------------------------------------------------
BISON_VERSION=$(bison--version| head-1| awk'{print$ 4}')
AC_SUBST(BISON_VERSION)
AC_SUBST(BISON_VERSION_3_FLAG)
AC_SUBST(BISON_VERSION_2_FLAG)
AC_MSG_CHECKING([野牛版])
AS_IF([test“$(echo”$ BISON_VERSION 3.0.4“| tr”“”\ n“| sort-rn| head-n 1)”==“$ BISON_VERSION”],
BISON_VERSION_3_FLAG=“define HAVE_BISON_VERSION_3”
BISON_VERSION_2_FLAG=“undef HAVE_BISON_VERSION_2”
],[
BISON_VERSION_3_FLAG=“undef HAVE_BISON_VERSION_3”
BISON_VERSION_2_FLAG=“define HAVE_BISON_VERSION_2”
])
AM_CONDITIONAL(ENABLE_BISON_VERSION_3,测试“$(echo”$ BISON_VERSION 3.0.4“| tr”“”\ n“| sort-rn| head-n 1)”==“$ BISON_VERSION”)
AC_MSG_RESULT([$ BISON_VERSION])
这里面定义了四个重要的变量:
BISON_VERSION是用来记录野牛的版本号;
BISON_VERSION_3_FLAG和 BISON_VERSION_2_FLAG是方便在 C/ C++的一些头文件中定义是版本 3还是版本 2,好做对应的处理;
ENABLE_BISON_VERSION_3的英文用来在的Makefile.am里面用于条件判定
那么的Makefile.am里面的条件判断可以写成如下所示:
AUTOMAKE_OPTIONS= foreign
dist_headers=$(通配符*.h*.hh)
AM_CPPFLAGS=-I$(top_srcdir)/ src\
$(NULL)
AM_LDFLAGS=$(NULL)
AM_YFLAGS=-d
AM_LFLAGS=-olex.yy.c
如果ENABLE_BISON_VERSION_3
noinst_LTLIBRARIES= libmysample_scanner.la libmysample.la
libmysample_scanner_la_SOURCES= MySampleParser.yy MySampleScanner.ll
libmysample_scanner_la_DEPENDENCIES= MySampleParser.yy
MySampleParser.yy:
sed的#%{#%代码需要{#'MySampleParser.yy.in> MySampleParser.yy
其他
noinst_LTLIBRARIES= libmysample.la
cc_files= MySampleParser.cc MySampleScanner.cc
万一
libmysample_la_SOURCES= XX.cpp$(cc_files)$(dist_headers)
如果ENABLE_BISON_VERSION_3
libmysample_la_LIBADD= libmysample_scanner.la
其他
libmysample_la_DEPENDENCIES= MySampleParser.hh
MySampleParser.hh:MySampleParser.yy libmysample_scanner.la
bison-o MySampleParser.cc MySampleParser.yy
万一
CLEANFILES= MySampleParser.hh\
MySampleParser.cc\
stack.hh\
position.hh\
location.hh
其中MySampleParser.yy.in写成状语从句:bison2.3版本的MySampleParser.yy一样即可。
通过此次调整,完美的解决了bison2.3和bison3.0.4在autoconf的编译的冲突问题,类似的冲突也可以采用此方式解决。