windows下的lex與yacc工具

來源:互聯網
上載者:User

 只所以推薦它是因為它產生的c檔案可以在vc++下通過編譯。
     http://www.bumblebeesoftware.com/downloads.htm
下載之後,解壓縮,然後安裝。開啟整合式開發環境,點項目Project菜單,在下拉式功能表中選LibBuilder,彈出LibBuilder對話方塊選擇屬性按鈕
彈出compiler properties 對話方塊,

Name 選擇Visual C++ (32-bit)
Directory :msvc32
options:
依次為
vc++版本(Versoin 7(.net))。
是否支援unicode碼。
是否把w_char_t作為內建類型。
下邊是VC的各種目錄:
依次為
Compiler Bin Directory (C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/VC7/BIN)
Compiler Bin Directory(C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/COMMON7/IDE)
Compiler Include Directory(C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/VC7/INCLUDE)
Compiler Include Directory(C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/VC7/PLATFORMSDK/INCLUDE)
Compiler Library Directory(C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/VC7/LIB)
Compiler Library Directory(C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO .NET 2003/VC7/PLATFORMSDK/LIB)
注意:括弧裡邊的是我自己編譯器安裝目錄,也許你的和我的不一樣,需要做相應的調整。
所有的這些設定完成之後點ok。返回LibBuilder。點Build就可以編譯vc++使用的lex與yacc的lib庫。產生庫檔案在軟體安裝目錄下的D:/Parser Generator 2/Cpp/Lib/msvc32目錄下。
然後我們我們在vc++環境設定中增加包含檔案目錄D:/Parser Generator 2/Cpp/Include
lib庫目錄D:/Parser Generator 2/Cpp/Lib/msvc32
具體設定
開啟VC++.net整合式開發環境。
點工具菜單
下拉式功能表中點選項菜單。
彈出框中點左邊列表框中的projects,然後點擊vc++目錄
在顯示以下內容目錄標籤下的列表框中“選包含目錄”進行設定,選“庫檔案”進行設定。
具體設定就是點擊列表框下邊五個按鈕中的第二個按鈕,就加入一行,當選擇“包含目錄”的時候填入D:/Parser Generator 2/Cpp/Include,當選擇“庫檔案”的時候填入D:/Parser Generator 2/Cpp/Lib/msvc32,也可以點右邊的瀏覽按鈕進行選擇。

這樣設定之後我們就可以用vc++編譯用Parser Generator 2產生的c檔案。具體為
開啟Parser Generator 2整合式開發環境。
點擊Project菜單,點擊下拉式功能表中的ParseWizard菜單,一路下去建立一個工程。然後點擊project菜單下的的Rebuild All。在專案檔夾下就產生了相應c檔案與h檔案。
用VC++建立一個空控制台工程,然後把用用Parser Generator 2產生的c檔案加入工程中。最後引入響應的庫檔案,就是我們在D:/Parser Generator 2/Cpp/Lib/msvc32目錄下產生的lex與yacc庫檔案。接著編譯,如果成功,那麼萬事大吉。

 

 


關於yacc 和 lex 和在下面連結的文章裡已經有所介紹了
/html/linuxshijie/20070909/80.html
連結中的文章還介紹了在linux下如何使用yacc和lex工具,下面主要是介紹yacc和lex在windows下的用法。

以下內容屬作者為xiaolin,請尊重作者的辛勤勞動,請勿轉載。

yacc和lex在windows已經移植成功,其中常用的一個工具就是Parser Generator。這個工具使用yacc和lex能夠產生Visual C++,Borland C++,Other C/C++以及相關Java代碼。下面介紹一下這個工具是如何產生代碼並使用Visual C++編譯的。
註:關於Parser Generator的使用和配置,其實在Parser Generator Help中已經有很詳細的介紹,感興趣的朋友可以去那裡查到更多有用的資訊。

首先要去http://www.bumblebeesoftware.com/downloads.htm下載Parser Generator。
安裝完畢後,我們可以在它的安裝目錄下找到一些例子以及編譯器所需的庫檔案和源檔案,這些檔案在編譯是很重要。

單獨yacc檔案的編譯。
以下是一個單獨的yacc檔案,實現一個簡單的計算機功能。
%{
/************************************************************
www.linmu100.com
************************************************************/
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double /* double type for YACC stack */
%}

%token NUMBER

%%
lines    : lines expr '/n'            { printf("%g/n", $2); }
        | lines '/n'
        | /* e */
        | error '/n'                { yyerror("reenter last line:"); yyerrok(); }
        ;

expr    : expr '+' term                { $$ = $1 + $3; }
        | expr '-' term                { $$ = $1 - $3; }
        | term
        ;

term    : term '*' factor            { $$ = $1 * $3; }
        | term '/' factor            { $$ = $1 / $3; }
        | factor
        ;

factor    : '(' expr ')'                { $$ = $2; }
        | '(' expr error            { $$ = $2; yyerror("missing ')'"); yyerrok(); }
        | '-' factor                { $$ = -$2; }
        | NUMBER
        ;

%%
int main(void)
{
    return yyparse();
}

int yylex(void)
{
    int c;
    while ((c = getchar()) == ' ');
    if (c == '.' || isdigit(c)) {
        ungetc(c, stdin);
        scanf("%lf", &yylval);
        return NUMBER;
    }
    return c;
}

我們用Parser Generator的Project --> Parser Wizard建立一個工程,如所示,注意紅圈部分的設定:

然後設定檔案,模板:

其餘按預設完成即可:

這時,我們可以看到Parser Generator幫我們自動產生了一個myparser.y檔案,文法規則就可以在這裡加了。


現在我們把開頭展示的yacc源碼完全覆蓋myparser.y檔案,然後編譯,成功後會產生三個檔案:myparser.c,myparser.h,myparser.v
好,現在我們要做的就是用vc來編譯myparser.c,myparser.h這兩個檔案了。

開啟Microsoft Visual C++ 6.0,建立一個工程。

然後將Parser Generator產生的兩個檔案myparser.c,myparser.h匯入工程。(這裡就不多說了^-^)
現在要設定環境變數了,首先要匯入Parser Generator的庫檔案和源檔案。在工具->選項裡要設定這些環境變數。


設定完這些檔案後,還要在工程->設定裡添加yl.lib庫:

好,一切設定完畢,開始編譯,編譯通過後,就會產生yacc_vc.exe檔案。
假設有檔案demo.txt,此檔案和yacc_vc.exe在同一個目錄,其內容如下:
1+3*5
3*4-23
7- 9 *30 - 999
在此目錄的命令列下運行如下命令:yacc_vc.exe <demo.txt,即可得到計算結果:

單獨lex檔案的編譯。
以下是一個單獨的lex檔案,實現一個簡單的計算單詞個數功能。
%{
/************************************************************
www.linmu100.com
************************************************************/
int wc = 0;        /* word count */
%}

%%
[a-zA-Z]+    { wc++; }
/n|.        { /* gobble up */ }

%%
int main(void)
{
    int n = yylex();
    return n;
}

int yywrap(void)
{
    printf("word count: %d/n", wc);
    return 1;
}

我們用Parser Generator建立一個工程:

下一步預設完成即可。這時,Parser Generator幫我們自動產生了一個mylexer.l檔案,詞法規則可以在這裡加。
同樣的,我們用上面展示的lex檔案內容完全覆蓋mylexer.l檔案,編譯後同樣產生三個檔案,然後用VC編譯其中的myparser.c,myparser.h這兩個檔案。
VC的設定方法和上面編譯單獨yacc檔案時的步驟完全一樣,最終會產生一個可以計算檔案單詞數目的.exe檔案。

yacc 和 lex整合檔案的編譯。
以下分別是yacc檔案和lex檔案的內容,這兩個檔案共同實現了自訂的一個簡單文法規則。
yacc檔案內容:
%{
/*
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
    fprintf(stderr,"error: %s/n",str);
}
int yywrap()
{
    return 1;
}
main()
{
    yyparse();
}
char *heater="xl's test";
%}

%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE
%union
{
    int number;
    char *string;
}

%token <number> STATE
%token <number> NUMBER
%token <string> WORD
%%

commands:
    | commands command
    ;
command:
    heat_switch | target_set | heater_select
    ;
heat_switch:
    TOKHEAT STATE
    {
        if($2)
            printf("/tHeater '%s' turned on/n", heater);
        else
            printf("/tHeat '%s' turned off/n", heater);
    }
    ;
target_set:
    TOKTARGET TOKTEMPERATURE NUMBER
    {
        printf("/tHeater '%s' temperature set to %d/n",heater, $3);
    }
    ;
heater_select:
    TOKHEATER WORD
    {
        printf("/tSelected heater '%s'/n",$2);
        heater=$2;
    }
    ;
lex檔案內容:
%{
/*
www.linmu100.com
*/
#include <stdio.h>
#include <string.h>
#include "myparser.h"                  //注意,這裡的標頭檔要和Parser Generator產生的標頭檔名一樣。
extern char *yytext;
%}
%%
[0-9]+                  {yylval.number=atoi(yytext); return NUMBER;}
heater            return TOKHEATER;
heat                    return TOKHEAT;
on|off                  {yylval.number=!strcmp(yytext,"on"); return STATE;}
target                  return TOKTARGET;
temperature             return TOKTEMPERATURE;
[a-z0-9]+        {yylval.string=strdup(yytext);return WORD;}
/n                      /* ignore end of line */;
[ /t]+                  /* ignore whitespace */;
%%

現在用Parser Generator建立新的工程:


其餘的步驟和上面編譯yacc時的步驟相同,最終可以產生both_y_l.exe檔案,放一個demo.txt和both_y_l.exe在同一個目錄下,demo.txt內容如下:
heat on
target temperature 99
heater asdfsieiwef99adsf
然後在此目錄的命令列下執行both_y_l.exe <demo.txt得到:

以上即為Parser Generator的使用以及如何用VC編譯。

/
/*-----Lex & Yacc ----www.linmu100.com ----*/
/
/*-----linux工具,Lex & Yacc,windows下操作----*/
/
/*-----linux配置,UNIX,開源軟體,linux技術,makefile----*/
/
/*----------------------@xiaolin--------------------*/
/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.