Qt项目集成Lex/Yacc的方法
2014-05-28 18:14
295 查看
最近项目中要用到Lex/Yacc,所以整理了一个Qt Creator中集成Lex/Yacc的方法。
我在Windows平台下开发,Lex/Yacc工具使用的是GnuWin的Flex和Bison,下载地址为GnuWin Flex和GnuWin
Bison,可以直接下载安装程序,安装之后还要把Flex和Bison所在的目录添加到环境变量中。
准备工作完成,先上.pro文件代码:
首先定义了变量FLEXSOURCES 和 BISONSOURCES 分别指向lex/yacc文件列表。因为我的项目中共有两个parser,所以相应的有两个lex文件和两个yacc文件。
qmake允许自定义工具来处理特殊的文件,这里我定义了两个工具分别名为flex和bison,有关这部分内容可以参考qmake Manual,不过官方文档中关于这部分的说明并不详细,很多参数并没有在文档中给出,更详细的说明可以参考这篇非官方的文档Undocumented
qmake,其中列出了很多官方文档中没有的内容。
下面详细解释这两个自定义工具。
input 属性指定了自定义工具需要处理的文件列表。我们自定义的flex工具需要处理的是lex文件,也就是FLEXSOURCES中的文件,相应的,bison工具需要处理的是BISONSOURCES中的文件。
output 属性指定了自定义工具执行后生成的文件名(可以包含路径)。需要注意的是,并不能保证最终生成的文件与output定义一致,或者说这仅仅是我们希望能够得到的文件。在我们定义的output中,PWD为项目当前路径,QMAKE_FILE_BASE为当前处理的文件名去除后缀。例如当flex工具处理vlg.l 时,output为vlg_lex.cpp,路径在当前路径下,当bison处理cst.y,output为cst_yacc.cpp,路径在当前路径下(但事实并非仅仅如此,后面会讲到)。
commands 属性指定了工具需要执行的命令。其中QMAKE_FILE_IN为当前的input,QMAKE_FILE_OUT即为当前input的output。例如当flex处理vlg.l 时,commands为
这时会发现,如果执行上面的命令,bison实际上会生成vlg_yacc.cpp和vlg_yacc.hpp两个文件,而vlg_yacc.hpp并不在之前定义的output中,不过这对后面的编译链接过程并没有影响。
clean 属性指定了当我们执行clean操作时需要删除的文件。所以在bison的clean中,我们需要把上面说的两个文件都删除。
variable_out 属性指定了生成的output将会被添加到哪里。在我们的定义中,flex和bison的output都会被添加到SOURCES中,以便让qmake继续处理。
CONFIG 属性对自定义工具进行若干配置。我们添加的target_predeps参数将会使flex和bison优先执行。其他配置具体可以查阅文档。
最后,把自定义的flex和bison工具添加到QMAKE_EXTRA_COMPILERS中,qmake将会识别这两个自定义工具,并在bulid或clean时按定义执行它们。所以,当qmake执行时,通过调用flex和bison,会先得到vlg_lex.cpp vlg_yacc.cpp vlg_yacc.hpp cst_lex.cpp cst_yacc.cpp cst_yacc.hpp这六个文件,然后在继续编译链接过程。
以上方法在Windows/Desktop Qt 5.3 MSVC 32bit 构建套件下运行测试通过,并且支持shadow build。
我在Windows平台下开发,Lex/Yacc工具使用的是GnuWin的Flex和Bison,下载地址为GnuWin Flex和GnuWin
Bison,可以直接下载安装程序,安装之后还要把Flex和Bison所在的目录添加到环境变量中。
准备工作完成,先上.pro文件代码:
#flex/bison sources FLEXSOURCES += \ lexyacc/vlg.l \ lexyacc/cst.l BISONSOURCES += \ lexyacc/vlg.y \ lexyacc/cst.y #flex flex.input = FLEXSOURCES flex.output = $$PWD/${QMAKE_FILE_BASE}_lex.cpp flex.commands = flex -P${QMAKE_FILE_BASE} -o${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} flex.clean = ${QMAKE_FILE_OUT} flex.variable_out = SOURCES flex.CONFIG = target_predeps QMAKE_EXTRA_COMPILERS += flex #bison bison.input = BISONSOURCES bison.output = $$PWD/${QMAKE_FILE_BASE}_yacc.cpp bison.commands = bison -d -l -o ${QMAKE_FILE_OUT} -p ${QMAKE_FILE_BASE} ${QMAKE_FILE_IN} bison.clean = $$$$PWD/${QMAKE_FILE_BASE}_yacc.cpp $$$$PWD/${QMAKE_FILE_BASE}_yacc.hpp bison.variable_out = SOURCES bison.CONFIG = target_predeps QMAKE_EXTRA_COMPILERS += bison
首先定义了变量FLEXSOURCES 和 BISONSOURCES 分别指向lex/yacc文件列表。因为我的项目中共有两个parser,所以相应的有两个lex文件和两个yacc文件。
qmake允许自定义工具来处理特殊的文件,这里我定义了两个工具分别名为flex和bison,有关这部分内容可以参考qmake Manual,不过官方文档中关于这部分的说明并不详细,很多参数并没有在文档中给出,更详细的说明可以参考这篇非官方的文档Undocumented
qmake,其中列出了很多官方文档中没有的内容。
下面详细解释这两个自定义工具。
input 属性指定了自定义工具需要处理的文件列表。我们自定义的flex工具需要处理的是lex文件,也就是FLEXSOURCES中的文件,相应的,bison工具需要处理的是BISONSOURCES中的文件。
output 属性指定了自定义工具执行后生成的文件名(可以包含路径)。需要注意的是,并不能保证最终生成的文件与output定义一致,或者说这仅仅是我们希望能够得到的文件。在我们定义的output中,PWD为项目当前路径,QMAKE_FILE_BASE为当前处理的文件名去除后缀。例如当flex工具处理vlg.l 时,output为vlg_lex.cpp,路径在当前路径下,当bison处理cst.y,output为cst_yacc.cpp,路径在当前路径下(但事实并非仅仅如此,后面会讲到)。
commands 属性指定了工具需要执行的命令。其中QMAKE_FILE_IN为当前的input,QMAKE_FILE_OUT即为当前input的output。例如当flex处理vlg.l 时,commands为
flex -Pvlg -o somepath/vlg_lex.cpp vlg.l又例如当bison处理vlg.y时,commands为
bison -d -l -o somepath/vlg_yacc.cpp -p vlg vlg.y
这时会发现,如果执行上面的命令,bison实际上会生成vlg_yacc.cpp和vlg_yacc.hpp两个文件,而vlg_yacc.hpp并不在之前定义的output中,不过这对后面的编译链接过程并没有影响。
clean 属性指定了当我们执行clean操作时需要删除的文件。所以在bison的clean中,我们需要把上面说的两个文件都删除。
variable_out 属性指定了生成的output将会被添加到哪里。在我们的定义中,flex和bison的output都会被添加到SOURCES中,以便让qmake继续处理。
CONFIG 属性对自定义工具进行若干配置。我们添加的target_predeps参数将会使flex和bison优先执行。其他配置具体可以查阅文档。
最后,把自定义的flex和bison工具添加到QMAKE_EXTRA_COMPILERS中,qmake将会识别这两个自定义工具,并在bulid或clean时按定义执行它们。所以,当qmake执行时,通过调用flex和bison,会先得到vlg_lex.cpp vlg_yacc.cpp vlg_yacc.hpp cst_lex.cpp cst_yacc.cpp cst_yacc.hpp这六个文件,然后在继续编译链接过程。
以上方法在Windows/Desktop Qt 5.3 MSVC 32bit 构建套件下运行测试通过,并且支持shadow build。
相关文章推荐
- 如何在QT项目中集成Bison/Flex(Yacc/Lex)自动编译生成功能
- Lex和Yacc应用方法(二).再识Lex与Yacc
- vs2005集成qt后产生的qt项目文件结构分析
- Code::Blocks集成QT的方法
- QT visual stuido 集成插件不能打开ui文件的解决方法
- 在web项目中集成xfire的方法
- vs2005下Qt项目中修改exe图标的方法
- 用VS2008集成Qt 4.7.3开发环境的方法
- Lex和Yacc应用方法(一).初识Lex
- Xfire集成到web 项目中遇到的问题 及解决方法
- vc++与YACC和LEX集成环境
- 转载:Lex和Yacc应用方法
- 项目集成birt发布到weblogic上,出错java.lang.NoSuchMethodError: initStandardObjects,解决方法
- 系统集成资质-集成项目管理工程师下午案例分析题解答方法
- Lex和Yacc使用方法(七).企业方面的实际应用
- Lex和Yacc应用方法(二).再识Lex与Yacc
- Lex和Yacc应用方法(一).初识Lex
- Lex和Yacc应用方法(一).初识Lex
- Lex和Yacc应用方法(六).语法树打印
- vc++与YACC和LEX集成环境