青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

yacc/lex windows 下 Parser Generator 使用指南

 

clip_image001[7]


關(guān)于yacc 和 lex 和在下面鏈接的文章里已經(jīng)有所介紹了
/html/linuxshijie/20070909/80.html
鏈接中的文章還介紹了在linux下如何使用yacc和lex工具,下面主要是介紹yacc和lex在windows下的用法。


       yacc和lex在windows已經(jīng)移植成功,其中常用的一個(gè)工具就是Parser Generator。這個(gè)工具使用yacc和lex能夠生成Visual C++,Borland C++,Other C/C++以及相關(guān)Java代碼。下面介紹一下這個(gè)工具是如何生成代碼并使用Visual C++編譯的。
注:關(guān)于Parser Generator的使用和配置,其實(shí)在Parser Generator Help中已經(jīng)有很詳細(xì)的介紹,感興趣的朋友可以去那里查到更多有用的信息。
首先要去http://www.bumblebeesoftware.com/downloads.htm下載Parser Generator。
安裝完畢后,我們可以在它的安裝目錄下找到一些例子以及編譯程序所需的庫(kù)文件和源文件,這些文件在編譯是很重要。
單獨(dú)yacc文件的編譯。



以下是一個(gè)單獨(dú)的yacc文件,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器功能。
%{
/************************************************************
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創(chuàng)建一個(gè)工程,如下圖所示,注意紅圈部分的設(shè)置:
clip_image002[7]


然后設(shè)置文件,模板:
clip_image003[7]


其余按默認(rèn)完成即可:
clip_image004[7]


這時(shí),我們可以看到Parser Generator幫我們自動(dòng)生成了一個(gè)myparser.y文件,語(yǔ)法規(guī)則就可以在這里加了。
clip_image005[7]


現(xiàn)在我們把開(kāi)頭展示的yacc源碼完全覆蓋myparser.y文件,然后編譯,成功后會(huì)生成三個(gè)文件:myparser.c,myparser.h,myparser.v
好,現(xiàn)在我們要做的就是用vc來(lái)編譯myparser.c,myparser.h這兩個(gè)文件了。


打開(kāi)Microsoft Visual C++ 6.0,新建一個(gè)工程。
clip_image006[7]


然后將Parser Generator生成的兩個(gè)文件myparser.c,myparser.h導(dǎo)入工程。(這里就不多說(shuō)了^-^)
現(xiàn)在要設(shè)置環(huán)境變量了,首先要導(dǎo)入Parser Generator的庫(kù)文件和源文件。在工具->選項(xiàng)里要設(shè)置這些環(huán)境變量。
clip_image007[7]


clip_image008[7]


clip_image009[7]


設(shè)置完這些文件后,還要在工程->設(shè)置里添加yl.lib庫(kù):
clip_image010[7]


好,一切設(shè)置完畢,開(kāi)始編譯,編譯通過(guò)后,就會(huì)生成yacc_vc.exe文件。
假設(shè)有文件demo.txt,此文件和yacc_vc.exe在同一個(gè)目錄,其內(nèi)容如下:
1+3*5
3*4-23
7- 9 *30 - 999


在此目錄的命令行下運(yùn)行如下命令:yacc_vc.exe <demo.txt,即可得到計(jì)算結(jié)果:
clip_image011[7]




單獨(dú)lex文件的編譯。
以下是一個(gè)單獨(dú)的lex文件,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算單詞個(gè)數(shù)功能。
%{
/************************************************************
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新建一個(gè)工程:
clip_image012[7]


clip_image013[7]


下一步默認(rèn)完成即可。這時(shí),Parser Generator幫我們自動(dòng)生成了一個(gè)mylexer.l文件,詞法規(guī)則可以在這里加。
同樣的,我們用上面展示的lex文件內(nèi)容完全覆蓋mylexer.l文件,編譯后同樣生成三個(gè)文件,然后用VC編譯其中的myparser.c,myparser.h這兩個(gè)文件。
VC的設(shè)置方法和上面編譯單獨(dú)yacc文件時(shí)的步驟完全一樣,最終會(huì)生成一個(gè)可以計(jì)算文件單詞數(shù)目的.exe文件。



yacc 和 lex整合文件的編譯。
以下分別是yacc文件和lex文件的內(nèi)容,這兩個(gè)文件共同實(shí)現(xiàn)了自定義的一個(gè)簡(jiǎn)單語(yǔ)法規(guī)則。
yacc文件內(nèi)容:
%{
/*
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文件內(nèi)容:
%{
/*
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 */;
%%
現(xiàn)在用Parser Generator創(chuàng)建新的工程:
clip_image014[7]


clip_image015[7]


clip_image016[7]


其余的步驟和上面編譯yacc時(shí)的步驟相同,最終可以生成both_y_l.exe文件,放一個(gè)demo.txt和both_y_l.exe在同一個(gè)目錄下,demo.txt內(nèi)容如下:
heat on
target temperature 99
heater asdfsieiwef99adsf


然后在此目錄的命令行下執(zhí)行both_y_l.exe <demo.txt得到:
clip_image017[7]


以上即為Parser Generator的使用以及如何用VC編譯。
/
/*-----Lex & Yacc ----www.linmu100.com ----*/
/
/*-----linux工具,Lex & Yacc,windows下操作----*/
/
/*-----linux配置,UNIX,開(kāi)源軟件,linux技術(shù),makefile----*/
/
/*----------------------@xiaolin--------------------*/

posted on 2008-09-19 17:54 肥仔 閱讀(3547) 評(píng)論(6)  編輯 收藏 引用 所屬分類: LEX & YACC

評(píng)論

# re: yacc/lex windows 下 Parser Generator 使用指南  回復(fù)  更多評(píng)論   

找了好久終于找到有用的
2011-07-27 20:17 | youq

# re: yacc/lex windows 下 Parser Generator 使用指南  回復(fù)  更多評(píng)論   

Lz 太感謝你了!
2011-07-27 20:17 | youqi1st

# re: yacc/lex windows 下 Parser Generator 使用指南  回復(fù)  更多評(píng)論   

這個(gè)版本在哪里可以下載到?找了好長(zhǎng)時(shí)間,都沒(méi)找到
2011-10-14 17:16 | 螞蟻編程

# re: yacc/lex windows 下 Parser Generator 使用指南[未登錄](méi)  回復(fù)  更多評(píng)論   

Parser Generator v2.07
http://www.bumblebeesoftware.com/downloads.htm
2012-01-02 23:49 | me
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久综合亚洲精品婷婷| 激情校园亚洲| 香蕉久久久久久久av网站| 夜久久久久久| 亚洲一区二区高清| 香蕉乱码成人久久天堂爱免费| 亚洲综合丁香| 久久精品成人一区二区三区| 久久精品三级| 欧美日韩日本国产亚洲在线| 国产精品自拍视频| 亚洲国产欧美另类丝袜| 在线视频中文亚洲| 久久久久久9999| 欧美激情片在线观看| 一区二区三区日韩欧美| 欧美一区二区三区在线播放| 女人香蕉久久**毛片精品| 国产精品国产三级国产普通话99| 国产亚洲成精品久久| 亚洲精品欧美在线| 久久精品网址| 亚洲免费久久| 久久久久久久久久久成人| 欧美日韩亚洲高清| 亚洲国产精品久久久久婷婷884| 亚洲婷婷免费| 欧美岛国激情| 欧美自拍偷拍| 美乳少妇欧美精品| 亚洲一区国产视频| 欧美精品一区在线发布| 国产欧美欧美| 亚洲一区二区视频| 欧美高清视频在线观看| 欧美在线www| 国产精品一区在线播放| 亚洲毛片在线| 欧美成人午夜激情视频| 久久成人精品一区二区三区| 欧美体内谢she精2性欧美| 亚洲人午夜精品免费| 久热国产精品| 午夜精品www| 国产毛片一区二区| 亚洲一区二区三区四区五区午夜| 亚洲高清二区| 久久精品在线视频| 国产亚洲女人久久久久毛片| 亚洲欧美日韩精品| 一区二区三区欧美| 国产精品每日更新| 欧美亚洲一区二区在线| 亚洲一区二区三区欧美| 国产精品高清网站| 亚洲欧美99| 亚洲一区二区三区高清不卡| 欧美调教视频| 午夜一区二区三区不卡视频| 国产精品99久久不卡二区| 欧美日韩一区在线观看| 亚洲一区二区在线播放| 在线亚洲一区观看| 国产精品美女久久久久久2018 | 老鸭窝亚洲一区二区三区| 欧美一区二区黄| 黄色日韩网站| 欧美国产日韩一二三区| 欧美国产在线视频| 亚洲深夜影院| 亚洲欧美视频在线观看视频| 国产亚洲精品aa午夜观看| 久久精品国产亚洲a| 久久久久国产精品厨房| 亚洲精品日韩精品| 亚洲一区二区欧美| 精品999日本| 亚洲国产小视频| 欧美日韩亚洲一区在线观看| 亚洲欧美三级伦理| 久久久久国产精品人| 亚洲精品一区二区三区不| 一区二区电影免费在线观看| 国产欧美日韩在线观看| 欧美成人精品激情在线观看| 久久一综合视频| 免费人成精品欧美精品| 国产精品久久久一区麻豆最新章节| 亚洲一区尤物| 久久久精品国产免费观看同学| 亚洲精品国产精品国自产在线| 在线亚洲美日韩| 亚洲成人资源网| 亚洲手机成人高清视频| 一区在线视频观看| 一区二区免费在线视频| 狠狠色狠狠色综合日日tαg| 亚洲美女视频在线观看| 狠狠爱综合网| 宅男噜噜噜66国产日韩在线观看| 国产欧美日本| 这里只有精品丝袜| 亚洲黄色毛片| 久久国产精品72免费观看| 亚洲视频欧美在线| 久久夜色精品国产欧美乱| 亚洲一区免费观看| 欧美电影免费观看大全| 久久久99国产精品免费| 欧美日韩妖精视频| 欧美黄色aa电影| 国产一区二区日韩精品欧美精品| 亚洲精品日产精品乱码不卡| 激情久久五月天| 亚洲欧美国产制服动漫| 在线午夜精品| 欧美国产高清| 欧美大尺度在线| 韩国欧美国产1区| 亚洲永久精品国产| 亚洲欧美日韩国产精品| 欧美精品国产一区| 欧美黑人国产人伦爽爽爽| 精品99视频| 久久久精品一区| 久久夜色撩人精品| 国内精品久久久久久久影视蜜臀| 亚洲欧美bt| 欧美一区二区精美| 国产精品自在在线| 亚洲无线一线二线三线区别av| 日韩午夜激情电影| 欧美剧在线免费观看网站| 亚洲激情综合| 99视频精品在线| 欧美区二区三区| 9久re热视频在线精品| 亚洲一区二区三区免费在线观看| 欧美日韩国产一区二区| 99精品欧美一区二区三区| 亚洲一区二区三区免费视频 | 麻豆成人在线观看| 欧美电影免费观看高清| 亚洲高清在线| 免费观看欧美在线视频的网站| 免费av成人在线| 亚洲精品国产视频| 欧美日韩卡一卡二| 一本色道久久88综合亚洲精品ⅰ| 一区二区三区久久精品| 国产精品国产a级| 性色一区二区三区| 免费影视亚洲| 99国产精品一区| 久久精品成人一区二区三区| 欧美粗暴jizz性欧美20| 亚洲大胆视频| 欧美精品久久久久久久| 99精品国产热久久91蜜凸| 欧美一级大片在线观看| 亚洲视频免费在线观看| 久久久精品国产免大香伊| 亚洲国产精品一区二区第四页av| 美女露胸一区二区三区| 夜夜精品视频一区二区| 久久精品在线观看| 亚洲黄一区二区| 国产精品美女久久久久久2018 | 欧美一区1区三区3区公司| 久久久久在线| 日韩午夜电影av| 国产日韩欧美精品一区| 久久婷婷影院| 中文av字幕一区| 欧美激情亚洲国产| 欧美伊人久久大香线蕉综合69| 极品日韩久久| 国产精品久久久久久久一区探花 | 久久久噜噜噜久久狠狠50岁| 亚洲人体大胆视频| 国产欧美在线播放| 欧美久久久久久久久| 欧美在线999| 国产精品99久久久久久久女警 | 在线亚洲精品| 亚洲第一级黄色片| 国产午夜精品全部视频播放| 欧美电影打屁股sp| 久久国产精品99国产精| 中日韩在线视频| 亚洲精品乱码久久久久| 开心色5月久久精品| 欧美一区二区三区日韩| 日韩性生活视频| 亚洲区一区二| 国产亚洲欧美色| 国产精品永久免费在线| 欧美日韩一区二区在线观看| 欧美韩日高清| 欧美成年人视频|