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

來源:互聯網
上載者:User

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平台開發淺談》中會有更詳細的說明。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.