当前位置: 首页 > 工具软件 > Lex > 使用案例 >

Lex和Yacc使用教程(九).Windows下使用Lex和Yacc

厍建义
2023-12-01

Lex和Yacc应用方法(九).Windows下使用Lex和Yacc

草木瓜  20070904

一、序

    不想Lex和Yacc系列的最后一篇文章竟如此“难产”,已时隔三个月之久。不由慨叹自由可支
配时间是如此之少,如此岂不谓新时代的“奴隶”~
    罢罢罢,闲话少叙,回归正题,本文主要介绍在Windows下如何去使用Lex和Yacc,以作为
本系列文章的终结。
   
二、方法介绍

    Windows下使用Lex和Yacc多种多样,简单罗列如下:
   
    a.Cygwin
   
    Cygwin是Windows平台上运行的unix/linux模拟环境,由Cygnus Solutions开发。
    Cygnus起初把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标
文件。然后再把这些工具移植到windows平台上去。
    移值方案有多种,一是基于win32 api对这些工具的源代码进行大幅修改。但工作量太大,他
们采取了另一种方法,即开发一个共享库(cygwin.dll),把win32 api中没有的unix风格的调用(如
fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于win32 api写了一个unix
系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主
机上的交叉编译器来生成可以在windows平台上运行的工具集。

    以这些移植到windows平台上的开发工具为基础,Cygnus又逐步把其他的工具(几乎不需要
对源代码进行修改,只需要一些配置脚本)软件移植到windows上来。这样,就在windows平台
模拟出一个unix环境。

    Cygwin是一个功能强大的工具集,借助它不需要一台 Unix 机器也可以编译运行 Unix 程序,
这可以帮助程序开发人员把应用程序从 UNIX/Linux 移植到 Windows 平台,或者在 Window 平台
开发 UNIX/Linux 应用程序。Cygwin目标在于兼容性,而不是执行效率。

    b.MinGW + MSYS
   
    MinGW (Minimalist GNU for Windows) 原来是Cygwin里GNU开发工具的一个分支,实质是一
些头文件和函数库的集合,该集合允许在没有第三方动态链接库的情况下使用GCC(GNU Compiler C)
开发Win32程序。MinGW主要由GNU binary utilities、GCC和GDB组成。同时还包括一些重要的
库:libc(C Runtime),专用于Win32环境的API接口库。MinGW开发的程序与MS Visual Studio
程序可以彼此互相通用。
    MinGW允许控制台模式的程序使用微软的标准C运行库(MSVCRT.DLL),所以你既可以用
GCC写控制台模式的ANSI程序,也可以用微软提供的 C 运行库。该功能是 Windows32 API 所
不具备的。
    Cygwin+gcc与MinGW,都是gcc在windows下的编译环境。Cygwin+gcc编译的程序,在windows
执行时必须依赖cygwin.dll,MinGW则不需要。相比 Cygwin 执行效率是 MinGW 的重点。

    MinGW只是开发环境,其实就是GCC在Windows下的一个实现,没有包括Linux/Unix一些其他
的工具(如bash,sh等),而MSYS弥补了这一点。MinGW常于MSYS配合使用。

    MSYS (Minimal GNU(POSIX)system on Windows) ,是一个小型的GNU环境,包括基本的
bash,make等等,其提供了Bourne shell的类似环境。

    c.下载flex与bison的Win32源码或版本
   
    其实上面两种方法本质也是这个。推荐网址: http://gnuwin32.sourceforge.net
   
    d.Dev-C++ 编译 由 bison flex 编译生成代码
   
    其实是使用 Dev C++ 代替了MinGW gcc 或者 Cygwin gcc。
    Dev-C++是一个C&C++开发工具,是一款自由软件,遵守GPL协议。它集合了GCC、MinGW32
等众多自由软件,并且可以从devpak.org上取得最新版本的各种工具支持,而这一切工作都是来自
全球的爱好者所做的工作。 Dev-C++ IDE采用Delphi开发。
 不过要注意的是,变量声明位置问题的会导致编译不通过,即使用前面文章的例子在Dev-C++默
认设置下是不能编译通过的。解决起来也简单,手工移到函数体开始就行了。

    e.使用Parser Generator

    Parser Generator可以生成Windows平台下的C/C++/Java LexYacc代码。支持Borland C++ Builder
和Visual C++多种编译环境。这里我使用的是Visual C++.Net 和 Eclipse 测试生成的LexYacc代码。

 (本机测试环境 Visual C++.Net / Eclipse 3.1 + Parser Generator 2.07 )
 
    在使用Parser Generator前,须要Build相关Lib。打开Parser Generator IDE,Project -> LibBuilder
-> 选中Visual C++ (32-Bit) -> Properties -> 在弹出的对话框中依次设置 Options,示例如下:
   
    Compile Version : Version 7 (.Net)
    Unicode : True
    Treat w_char as Build-in Type :  True
    Compiler Bin Directory : E:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin
    Compiler Bin Directory (2) : E:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE
    Compiler Include Directory : E:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include
    Compiler Include Directory (2) : E:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/PlatformSDK/Include
    Compiler Library Directory : E:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/lib
    Compiler Library Directory (2) : E:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/PlatformSDK/Lib
   
 注:注意根据自已情况调整Directory目录位置。
 
 设置完成之后确认并返回LibBuilder。点击Build就可以编译Visual C++须使用的lex与yacc的lib库。生成库
文件在软件安装目录下的E:/Program Files/Parser/Cpp/Lib/msvc32下。
 然后可以在Visual C++环境下设置添加
  头文件目录
  E:/Program Files/Parser/Cpp/Include
  库文件目录
  E:/Program Files/Parser/Cpp/Lib/msvc32
  依赖项
  yl.lib yld.lib ylmt.lib ylmtd.lib ylmtr.lib ylmtrd.lib ylmtri.lib ylmtrid.lib
  
 (Visual C++ 环境设置方法可见 《Oracle数据库开发(一).Windows下配置使用ProC》http://blog.csdn.net/liwei_cmg/archive/2007/06/06/1641330.aspx 一文,有详尽的描述,这里不在赘述 ) 
 
 Java的代码生成也十分相似,将自带示例E:/Program Files/Parser/Java/Examples/Calc代码,添加到Eclipse项目
并把E:/Program Files/Parser/Java/Lib/yl.jar添加到项目中,启动Java Application即可。

    项目文件列表:
   
    calc_lexer.java
    calc_parser.java
    Symbol.java
    SymbolTable.java
   
    yl.jar
   
    Run As -> Java Application ,控制台Console即可进行输入测试。
 
    更多Parser Generator使用方法,见联机手册。
   
   
三、后记

    本文所提到的方法大多一带而过,至于具体的内容,每个人自可亲自尝试,此也不属于本系列
的范围。文中提到的交叉编译的问题,这个概念在《手机应用与开发》一栏已有比较整体的描述,
在未来系列《Linux平台开发浅谈》中会有更详细的说明。
 

 类似资料: