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

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            使用bison和flex工具

            Posted on 2010-09-20 15:29 Prayer 閱讀(791) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++
            這里有一個(gè)使用bison建立一個(gè)簡(jiǎn)單的計(jì)算器的例子:
            http://www.cs.berkeley.edu/~maratb/cs164/bison.html

            使用bison和flex工具學(xué)習(xí)編譯原理,遠(yuǎn)比單獨(dú)看書然后自己編寫一些程序生動(dòng)的多。這樣你就不會(huì)在那些復(fù)雜的字符處理,正則表達(dá)式的處理上浪費(fèi)精力,最后費(fèi)盡心力,卻沒(méi)有結(jié)果,失去了學(xué)習(xí)的興趣。

            我 這里有一個(gè)簡(jiǎn)單的計(jì)算器的程序,可以實(shí)現(xiàn)加、減、乘、除運(yùn)算,并支持括號(hào)的處理和26個(gè)字母作為變量。以前自己使用后綴表達(dá)式方式寫過(guò)一個(gè)這樣的程序,單 單中綴表達(dá)式改為后綴表達(dá)式就是幾百行的代碼,反正自己現(xiàn)在還是不知道怎么處理里面復(fù)雜的堆棧的(我用了STL的List實(shí)現(xiàn))。


            詞法處理文件calc.lex內(nèi)容如下:
            %{
                /*
                 *  一個(gè)簡(jiǎn)單計(jì)算器的Lex詞法文件
                 */
                #include <stdlib.h>
               
                void yyerror(char*);
                #include "calc.tab.h"
            %}
            %%
                /* a-z為變量 */
            [a-z]    {
                    yylval = *yytext - 'a';
                    return VARIABLE;
                }
                /* 整數(shù) */
            [0-9]+    {
                    yylval = atoi(yytext);
                    return INTEGER;
                }
                /* 運(yùn)算符 */
            [-+()=/*\n]    {return *yytext;}
                /* 空白被忽略 */
            [ \t]    ;
                /* 其他字符都是非法的 */
            .    yyerror("無(wú)效的輸入字符");
            %%
            int    yywrap(void)
            {
                return 1;
            }
            詞法處理的目標(biāo)就是區(qū)分出來(lái)每個(gè)成員到底是什么,這里有兩種 INTEGER和VARIABLE。只要區(qū)分出來(lái)各個(gè)成分詞法分析的任務(wù)就完成了。



            語(yǔ)法處理文件calc.y內(nèi)容如下:
            %token    INTEGER VARIABLE
            %left    '+' '-'
            %left    '*' '/'
            %{
                #include <stdio.h>
                void yyerror(char*);
                int yylex(void);
                int sym[26];
            %}
            %%
            program:
                program statement '\n'
                |
                ;
            statement:
                 expr    {printf("%d\n", $1);}
                 |VARIABLE '=' expr    {sym[$1] = $3;}
                 ;
            expr:
                INTEGER
                |VARIABLE{$$ = sym[$1];}
                |expr '+' expr    {$$ = $1 + $3;}
                |expr '-' expr    {$$ = $1 - $3;}
                |expr '*' expr    {$$ = $1 * $3;}
                |expr '/' expr    {$$ = $1 / $3;}
                |'('expr')'    {$$ = $2;}
                ;
            %%
            void yyerror(char* s)
            {
                fprintf(stderr, "%s\n", s);
            }
            int main(void)
            {
                printf("A simple calculator.\n");
                yyparse();
                return 0;
            }
            語(yǔ)法分析文件的寫法就是將BNF表達(dá)式描述一下即可,規(guī)則隨著條目逐漸細(xì)化,變成了可以理解的內(nèi)容。這里不用管如何實(shí)現(xiàn)這些語(yǔ)法的分析,只是需要告知如何構(gòu)建這些語(yǔ)法。



            編譯命令如下:
            >bison -d calc.y
            >flex calc.lex
            >gcc calc.tab.c lex.yy.c -o calc

            91久久婷婷国产综合精品青草| 久久国产香蕉一区精品| 精品无码人妻久久久久久| 91精品国产9l久久久久| 亚洲精品无码久久千人斩| 久久久久亚洲AV无码观看| 久久福利资源国产精品999| 亚洲欧美另类日本久久国产真实乱对白| 成人精品一区二区久久| 亚洲国产精品热久久| 91麻豆精品国产91久久久久久| 亚洲国产精品婷婷久久| 久久九九久精品国产| 色天使久久综合网天天| 久久久久亚洲AV成人网人人网站 | 久久久精品久久久久特色影视| 精品久久人人爽天天玩人人妻| 久久久99精品成人片中文字幕 | 久久播电影网| 欧洲国产伦久久久久久久| 久久久久亚洲国产| 久久久久人妻精品一区| 99久久国产免费福利| 久久久久99精品成人片牛牛影视| 久久精品极品盛宴观看| 久久久久久毛片免费播放| 国产激情久久久久影院老熟女| 久久影院亚洲一区| 亚洲伊人久久精品影院| 色偷偷888欧美精品久久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久强奷乱码老熟女网站| 久久99国产精品一区二区| 国产精品日韩深夜福利久久| 久久久精品波多野结衣| 午夜不卡久久精品无码免费| 色综合久久88色综合天天| 久久久国产99久久国产一| 伊人丁香狠狠色综合久久| yy6080久久| 精品久久久久久无码中文野结衣|