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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

yacc/lex windows 下 Parser Generator 使用指南

 

clip_image001[7]


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


       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創建一個工程,如下圖所示,注意紅圈部分的設置:
clip_image002[7]


然后設置文件,模板:
clip_image003[7]


其余按默認完成即可:
clip_image004[7]


這時,我們可以看到Parser Generator幫我們自動生成了一個myparser.y文件,語法規則就可以在這里加了。
clip_image005[7]


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


打開Microsoft Visual C++ 6.0,新建一個工程。
clip_image006[7]


然后將Parser Generator生成的兩個文件myparser.c,myparser.h導入工程。(這里就不多說了^-^)
現在要設置環境變量了,首先要導入Parser Generator的庫文件和源文件。在工具->選項里要設置這些環境變量。
clip_image007[7]


clip_image008[7]


clip_image009[7]


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


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


在此目錄的命令行下運行如下命令:yacc_vc.exe <demo.txt,即可得到計算結果:
clip_image011[7]




單獨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新建一個工程:
clip_image012[7]


clip_image013[7]


下一步默認完成即可。這時,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創建新的工程:
clip_image014[7]


clip_image015[7]


clip_image016[7]


其余的步驟和上面編譯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得到:
clip_image017[7]


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

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

評論

# re: yacc/lex windows 下 Parser Generator 使用指南  回復  更多評論   

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

# re: yacc/lex windows 下 Parser Generator 使用指南  回復  更多評論   

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

# re: yacc/lex windows 下 Parser Generator 使用指南  回復  更多評論   

這個版本在哪里可以下載到?找了好長時間,都沒找到
2011-10-14 17:16 | 螞蟻編程

# re: yacc/lex windows 下 Parser Generator 使用指南[未登錄]  回復  更多評論   

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>
            99这里只有久久精品视频| 国产欧美日韩一区二区三区在线| 欧美黄污视频| 亚洲日本免费| 99香蕉国产精品偷在线观看| 国产精品裸体一区二区三区| 欧美一区二区私人影院日本| 久久久亚洲综合| 99视频精品免费观看| 亚洲人成毛片在线播放| 欧美日韩一区二区三区高清| 久久精品国产第一区二区三区| 久久精品欧美| 99亚洲伊人久久精品影院红桃| 亚洲午夜激情免费视频| 一区二区三区中文在线观看| 亚洲伦理精品| 亚洲国产清纯| 久久不射2019中文字幕| 亚洲欧美日韩在线高清直播| 欧美成人首页| 亚洲电影下载| 亚洲高清视频的网址| 久久精品综合网| 性欧美激情精品| 欧美乱妇高清无乱码| 亚洲福利在线视频| 最新精品在线| 欧美精品电影| 99精品视频免费观看| 亚洲午夜精品一区二区三区他趣| 欧美成人免费播放| 日韩午夜精品| 亚洲欧美综合国产精品一区| 国产午夜精品久久| 久久夜色精品亚洲噜噜国产mv| 国产中文一区二区三区| 亚洲一区三区在线观看| 小黄鸭精品aⅴ导航网站入口 | 国产一区二区三区自拍| 欧美国产日本| 亚洲精品少妇网址| 国产精品国码视频| 久久精品首页| 亚洲激情成人网| 欧美一区二区三区免费在线看| 国产精品一区久久久| 久久精品盗摄| 99v久久综合狠狠综合久久| 亚洲女同精品视频| 91久久国产精品91久久性色| 久久精品一本| 亚洲一区二区三区激情| 永久免费毛片在线播放不卡| 欧美日韩精品系列| 欧美黄在线观看| 一区二区三区三区在线| 欧美成人网在线| 亚洲影视中文字幕| 国产美女精品免费电影| 男人的天堂成人在线| 亚洲精品字幕| 欧美在线播放一区二区| 亚洲精品极品| 亚洲精品视频免费| 亚洲激情视频网站| 红桃视频国产一区| 国产人久久人人人人爽| 国产精品sm| 国产欧美日韩一区二区三区在线观看 | 亚洲欧洲精品一区二区| 日韩午夜在线电影| 每日更新成人在线视频| 欧美一区二区三区另类| 亚洲直播在线一区| 亚洲午夜极品| 亚洲视频视频在线| 亚洲香蕉伊综合在人在线视看| 亚洲免费高清| 亚洲一区在线观看视频 | 亚洲国产精品悠悠久久琪琪| 久久人人爽人人爽| 免费看精品久久片| 亚洲免费观看高清完整版在线观看熊| 亚洲国产日韩欧美综合久久| 亚洲欧洲在线看| 亚洲婷婷综合色高清在线 | 欧美国产激情| 快射av在线播放一区| 久久精品亚洲一区二区三区浴池| 欧美中文字幕在线观看| 久久精品亚洲一区二区三区浴池| 久久精品盗摄| 欧美激情视频一区二区三区免费| 欧美精品一区二区三区四区| 国产精品sss| 亚洲国产精品va在看黑人| 99精品视频网| 免费观看久久久4p| 一区二区日韩精品| 另类国产ts人妖高潮视频| 欧美日韩精品高清| 好吊妞**欧美| 午夜国产精品视频免费体验区| 欧美激情影音先锋| 欧美中文日韩| 亚洲视频一二三| 欧美精品18+| 亚洲国产成人高清精品| 亚洲欧美视频| 日韩西西人体444www| 猛干欧美女孩| 韩国av一区二区| 久久精品国产欧美亚洲人人爽| 99热免费精品| 欧美日韩在线观看一区二区| 亚洲精品一区在线观看香蕉| 欧美韩日一区二区| 欧美激情网站在线观看| 亚洲激情成人在线| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品一区二区三区不| 欧美一进一出视频| 韩国精品在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲天堂男人| 影音先锋在线一区| 久久三级福利| 久久人人97超碰精品888| 亚洲国产精品va在线看黑人| 久久精品青青大伊人av| 久久精品中文字幕一区| 最新日韩在线| 午夜精品一区二区三区在线播放| 国内精品美女av在线播放| 亚洲国产清纯| 国内精品模特av私拍在线观看| 欧美大尺度在线观看| 国产精品永久| 亚洲第一二三四五区| 国产欧美精品一区aⅴ影院| 欧美v日韩v国产v| 国产精品一区视频网站| 91久久黄色| 国模精品一区二区三区| 亚洲影院污污.| 午夜在线视频一区二区区别| 久久人91精品久久久久久不卡| 欧美一区二区视频97| 国产精品久线观看视频| 欧美二区在线观看| 亚洲国产日韩欧美在线图片| 久久精品综合网| 久久久久久夜精品精品免费| 欧美日韩国产综合视频在线观看中文 | 国产精品免费视频观看| 久久久噜噜噜久久人人看| 欧美日韩另类国产亚洲欧美一级| 欧美在线视频免费| 国产精品伦一区| 一区二区三区久久久| 一区二区三区欧美在线观看| 久久久久久久久久久成人| 欧美一区二区三区日韩视频| 国产精品国产自产拍高清av王其 | 久热精品视频在线| 欧美粗暴jizz性欧美20| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品欧美经典| 亚洲免费影视| 久久久精品国产免大香伊| 国产亚洲欧美一区二区| 久久久亚洲精品一区二区三区| 久久精品导航| 91久久精品网| 国产精品伦理| 欧美成人黄色小视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲视频导航| 一区在线观看视频| 国产精品国产三级国产普通话蜜臀| 亚洲欧美激情视频| 亚洲区国产区| 美脚丝袜一区二区三区在线观看| 亚洲韩国青草视频| 亚洲精品乱码久久久久久久久| 一本一道久久综合狠狠老精东影业| 国产精品欧美日韩一区| 免费观看亚洲视频大全| 久久福利视频导航| 亚洲最新色图| 亚洲成色www8888| 欧美99久久| 久久婷婷久久| 欧美在线免费视屏| 午夜日韩激情| 亚洲一区二区免费在线| 99av国产精品欲麻豆| 亚洲精品少妇网址| 亚洲黑丝在线|