• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎ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文件,語法規(guī)則就可以在這里加了。
            clip_image005[7]


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


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


            然后將Parser Generator生成的兩個(gè)文件myparser.c,myparser.h導(dǎo)入工程。(這里就不多說了^-^)
            現(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è)置完畢,開始編譯,編譯通過后,就會(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)單語法規(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,開源軟件,linux技術(shù),makefile----*/
            /
            /*----------------------@xiaolin--------------------*/

            posted on 2008-09-19 17:54 肥仔 閱讀(3533) 評(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í)間,都沒找到
            2011-10-14 17:16 | 螞蟻編程

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

            Parser Generator v2.07
            http://www.bumblebeesoftware.com/downloads.htm
            2012-01-02 23:49 | me
            国内精品久久久久影院薰衣草| 国产成人AV综合久久| 久久久精品无码专区不卡| 久久亚洲视频| 久久er热视频在这里精品| 久久人妻少妇嫩草AV蜜桃| 亚洲精品无码久久久| 99久久婷婷国产一区二区| 欧美大香线蕉线伊人久久| 久久99精品国产99久久6| 俺来也俺去啦久久综合网| 无码国内精品久久综合88| 青青青伊人色综合久久| 97热久久免费频精品99| 久久久久亚洲av无码专区| 国产69精品久久久久观看软件| 久久精品中文騷妇女内射| 久久天天躁狠狠躁夜夜2020 | 草草久久久无码国产专区| 一级A毛片免费观看久久精品| 国产精品久久久久久搜索| 久久午夜夜伦鲁鲁片免费无码影视 | 三级片免费观看久久| 久久99精品久久久久久齐齐| 亚洲AV日韩精品久久久久| 亚洲AV乱码久久精品蜜桃| 久久人妻少妇嫩草AV蜜桃| 欧美亚洲另类久久综合| 精品国产一区二区三区久久久狼| 久久人人爽人人爽人人片AV高清| 久久婷婷人人澡人人爽人人爱| 国产叼嘿久久精品久久| 国内精品久久九九国产精品| 久久国产高潮流白浆免费观看| 区久久AAA片69亚洲| 中文字幕无码久久精品青草| 日韩欧美亚洲综合久久影院Ds | a级毛片无码兔费真人久久| 蜜桃麻豆www久久| 国产99久久久国产精品~~牛| 欧美日韩中文字幕久久伊人|