如何兼容bison2.3和bison3.0.4版本

 我来答
richeonil
2017-06-16 · TA获得超过1.1万个赞
知道大有可为答主
回答量:2260
采纳率:89%
帮助的人:660万
展开全部
假设有一个工程,采用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的编译的冲突问题,类似的冲突也可以采用此方式解决。
意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103R8T6是ST旗下的一款常用的增强型系列微控制器,是一款基于ARM Cortex-M内核的微控制器。STM32F103R8T6主要面向消费类电子产品、工业控制、医疗仪器、汽车电子等领域,可用于开发各种类型的应用。STM32... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式