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

            loop_in_codes

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            實現一種解釋性腳本語言(三)

            author: Kevin Lynx email: zmhn320#163.com date: 3.7.2009

            詞法分析

                詞法分析屬于整個編譯流程中的第一個階段。為什么要把編譯過程分為多個階段,這就
            如同軟件分層一樣,個人覺得是出于降低復雜性的考慮。
                再次聲明我不會告訴你任何編譯原理的理論知識,因為坦率地說我也不會:D。所以我努
            力將我們需要了解的概念盡可能簡單地告訴你。當然,可能會與教科書不吻合。

            什么是詞法分析?

                詞法分析就是把一段話整理成單詞集合。舉個簡單的例子,例如有代碼:age = age + 1;,
            經過詞法分析后,將得到:age、=、age、+、1、;幾個符號。為了方便,我稱每個單詞為一
            個token。

            詞法分析的作用

                詞法分析分析出來的單詞集合,直接作為編譯流程中接下來的語法分析的輸入。那么語
            法分析階段面對的將是一個一個的token,而不是單個的字符。
                例如,在處理age = age + 1;這種語句時,當我們獲取到token "="時,我們直接期望接
            下來的token應該是個表達式。以單詞為單位地處理,比直接處理單個字符簡單很多。

            詞法分析的過程

                詞法分析的輸入是單個字符流,一般我們fopen一個源代碼文件,保存在一個char緩存
            里,這就是詞法分析的輸入。而詞法分析的最終輸出結果就是一個一個的token。
                為了處理方便,token并不是單純的單詞。通常我們會將源代碼中的所有單詞分類,例
            如變量名其實都屬于一類token。簡單的token可定義為:
                struct Token
                {
                    int type;
                    char value[256];
                };
                type用于表示token的類型,例如一個變量名token的類型是一個標識符。value可以用
            來具體地保存這個變量的名字。

                對于type的處理,通常會事先定義一組枚舉值,例如:
                enum    {    ID, NUM, STRING, IF, ELSE, WHILE, RETURN, FUNCTION }等等用于標示
            在一個源代碼中可能出現的所有token。

                雖然說詞法分析的結果是一個token集合,但事實上我們并不是一次做完詞法分析。通常
            詞法分析模塊提供一個get_token函數。每次調用該函數時,都返回源代碼中下一個token。
            例如,有源代碼:age = age + 1;
                第一次調用get_token將獲得 { ID, "age" },第二次獲得 { ASSIGN, "=" },第三次
            獲得{ ID, "age" },等等。

                那么,詞法分析該如何實現?也就是struct Token get_token()函數如何實現?其實很
            簡單,你告訴我:給你一個字符串,你如何判斷這個字符串全部是數字?
                int is_num( const char *str )
                {
                    while( *str != 0 )
                    {
                        if( !isdigit( *str++ ) ) return 0;
                    }
                    return 1;
                }
                所以,基本上,詞法分析的過程也就是這個過程。就拿標識符舉例,典型的標識符一般
            以字符開頭,然后接著是數字或字符或_,當遇到非法字符時,這個標識符的掃描即結束。
                詞法分析一般是個while+switch:
                struct Token get_token()
                {
                    while( current_char != 0 )
                    {
                        switch( current_char )
                        {
                            case CHARACTER:
                                /* 掃描一個標識符 token */
                                break;

                            case '=':
                                /* 獲得一個 ASSIGN token */
                                break;

                                ...
                        }
                    }
                }

                現在,試著去總結一門語言里的每一個token的規則,然后自己去寫寫看。

            代碼導讀

                在本節我將提供kl在googlecode的SVN上的代碼,先不要去管代碼包中的其他東西。關于
            詞法的代碼可以在kllex.c kllex.h中找到。lex_token是提供給其他模塊的接口,用于獲取
            當前掃描的token。掃描結果可以通過lexState結構體獲取。
                再次提下版權問題,代碼文件以及代碼包中我并沒有加入任何版權說明,哪怕是GPL。
            但是如同我之前說的一樣,我不介意你傳播、改動此代碼,但是請保留原作者信息。當然,
            我并不介意你加上@modified by xxx:)。

                下載kl源代碼:http://klcommon.googlecode.com/files/kllan_0.1.0.zip

            posted on 2009-03-07 13:43 Kevin Lynx 閱讀(3848) 評論(2)  編輯 收藏 引用 所屬分類: kl腳本實現編譯原理

            評論

            # re: 實現一種解釋性腳本語言(三) 2009-03-15 16:28 夢在天涯

            while( *str != 0 )
            {
            if( !isdigit( *str ) ) return 0;
            }

            為什么不是if(str != 0)
            {
            if(!isdigit(*str) return 0;
            }
            return 1;  回復  更多評論   

            # re: 實現一種解釋性腳本語言(三) 2009-03-15 16:47 Kevin Lynx

            @夢在天涯
            這個例子是用于判定一個字符串是否全部是數字,不過例子中寫的有問題,應該是:
            int is_number( const char *str )
            {
            while( *str != 0 )
            {
            if( !isdigit( *str++ ) ) return 0;
            }
            return 1;
            }

            謝謝提醒。
              回復  更多評論   

            亚洲欧美一区二区三区久久| 欧美黑人激情性久久| 亚洲国产精品一区二区久久| 久久国产精品一区| 久久99九九国产免费看小说| 国产精品对白刺激久久久| 久久93精品国产91久久综合 | 亚洲精品国产字幕久久不卡| 久久综合狠狠综合久久综合88 | 国产成人综合久久精品红| 无码AV波多野结衣久久| 久久精品国产99久久丝袜| 人妻少妇久久中文字幕一区二区 | 69久久精品无码一区二区| 亚洲Av无码国产情品久久| 国产女人aaa级久久久级| 日产精品久久久一区二区| 久久久久国产精品嫩草影院| 亚洲va久久久噜噜噜久久| 久久av高潮av无码av喷吹| 99热都是精品久久久久久| 国产三级久久久精品麻豆三级| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久99精品国产麻豆宅宅| 无码AV中文字幕久久专区| 久久久无码精品亚洲日韩京东传媒 | 婷婷久久五月天| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 国产亚洲精品自在久久| 午夜久久久久久禁播电影| 久久91精品国产91久| 久久综合偷偷噜噜噜色| 香蕉aa三级久久毛片| 亚洲国产成人精品无码久久久久久综合| 国内精品久久久久久不卡影院 | 精品无码久久久久国产| 久久久久亚洲精品无码蜜桃 | 亚洲欧美精品伊人久久| 国产精品亚洲综合专区片高清久久久 | 老司机午夜网站国内精品久久久久久久久| 国产精品99久久免费观看|