您的位置:首页 > 编程语言 > Qt开发

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文件代码:

#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 Lex Yacc Flex Bison