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

            語法分析

                語法分析接收詞法分析階段的token集合為輸入,將這些沒有關系的tokens整理為相互
            之間有關系的結構。書面點的說法叫語法樹。
                每一次讓我寫這些文縐縐的概念真讓我受不了:D。

            語法樹

                語法樹簡單來說就是一個以token作為每個節點的樹型結構。例如我們有表達式age =
            age + 1;,在詞法階段它被整理為token集合:age, =, age, +, 1。那么在經過語法分析后
            ,這些tokens將被整理為大致如下的樹形結構:
                    =
                  /   \
                age    +
                     /   \
                   age     1

                整理成這樣的結構有什么好處?就kl解釋器而言,最直接的好處就是我可以遞歸地解釋
            這棵樹執行。例如:

                value compute( TreeNode *root )
                {
                    /* child[0]保存結果值age,child[1]是那個+表達式 */
                    return op_exp( root->child[1] );
                }

                value op_exp( TreeNode *node )
                {
                    switch( node->op )
                    {
                        case '+':
                        {
                            /* + 表達式必然有左右操作數 */
                            value left = factor( node->child[0] );
                            value right = factor( node->child[1] );
                            return left + right;
                        }
                    }
                }
                value factor( TreeNode *node )
                {
                    switch( node->type )
                    {
                        case ID:
                            /* 查找age的值 */
                            return age;

                        case CONST:
                            /* 1 是常量 */
                            return node->cvalue;
                    }
                }

                如你所見,當我們完成了語法分析階段,我們就可以完成我們的解釋器了。后面我會單
            獨講解下整個解釋過程,包括每個模塊是如何協作的。我不知道其他解釋器是怎么做的,但
            是我這樣做,起碼結果是對的。

            如何整理出語法樹?

                這里不得不提到所謂的BNF文法,很明顯你還是無法從我這里獲取編譯原理里某個概念
            的講解。我這里提這個概念完全是方便我提到這個東西。
                每一種語言都有其自己的BNF文法,因為萬惡的先知告訴我們,每一門語言都需要建立
            其語法樹。- -!
                就像詞法分析一樣,因為大部分語言的結構都差不多,所以我覺得詞法分析和語法分析
            基本上都沒有任何特別之處。也就是說,別的語言的BNF你可以直接拿來改改用。
                抄個BNF如下:
                exp -> exp adop term | term
                addop -> + | -
                term -> term mulop factor | factor
                mulop -> *
                factor -> (exp) | number
                這個BNF用來描述一般的算數表達式(+-*/)。簡單來說,一門語言的BNF就是用于描述該
            語言所有語句的東西,包括if、while、函數定義之類。建議你google一下C語言的BNF,并
            改造之用于你自己的語言。

                那么有了BNF之后,該如何整理出語法樹呢?
                通常,我們的代碼里都會直接有對應exp、term、addop之類的函數。按照我這句話的意
            思,上面抄的BNF被翻譯為程序代碼后,就可能為:
                exp()
                {
                    if( ... ) left = exp()
                    right = term();
                    left addop right;
                }
                term()
                {
                    if( ... ) left = term()
                    right = factor();
                    left mulop right;
                }
                factor()
                {
                    if( ... ) return exp();
                    else return number;
                }

                (可能還會涉及到EBNF,用于處理重復和選擇的一些情況---不用管這句話)

                每一個函數基本上都會返回一個樹節點,當然,該節點下可能會有很多子節點。   

            總結

                語法分析基本上就是以上信息。它將詞法分析輸出的token集合整理成一顆語法樹。為
            了整理出這棵語法樹,你需要找一份用于描述你語言的BNF,然后根據BNF翻譯成處理代碼。

            代碼導讀

                kl中的整個語法分析代碼位于klparser.c/klparser.h中,其BNF基本上取自<編譯原理與
            實踐>附錄中的C_語言。

            posted on 2009-03-09 11:12 Kevin Lynx 閱讀(3650) 評論(3)  編輯 收藏 引用 所屬分類: kl腳本實現編譯原理

            評論

            # re: 實現一種解釋性腳本語言(四) 2009-03-09 22:17 陳梓瀚(vczh)

            你的結構沒有考慮語法錯誤的處理辦法。  回復  更多評論   

            # re: 實現一種解釋性腳本語言(四) 2009-03-09 22:26 Kevin Lynx

            @陳梓瀚(vczh)
            貌似是的,后面對于錯誤的處理,甚至最基本的錯誤報告(定位)都存在問題。對這塊不熟,沒管了。
              回復  更多評論   

            # re: 實現一種解釋性腳本語言(四) 2009-03-10 13:29 陳梓瀚(vczh)

            @Kevin Lynx
            見【http://www.shnenglu.com/vczh/archive/2008/06/15/53373.html】  回復  更多評論   

            97精品依人久久久大香线蕉97| 伊人久久综合无码成人网| 久久99免费视频| 91麻豆精品国产91久久久久久| 国内精品久久久久久麻豆| 久久久久女教师免费一区| 欧洲成人午夜精品无码区久久 | 一极黄色视频久久网站| 久久精品国产亚洲αv忘忧草| AV色综合久久天堂AV色综合在| 激情五月综合综合久久69| 亚洲色欲久久久久综合网| 精品久久久无码人妻中文字幕豆芽| 国内精品久久久久久中文字幕| 久久AV高潮AV无码AV| 精品久久国产一区二区三区香蕉| 伊人久久大香线蕉AV色婷婷色 | 久久精品无码一区二区无码 | 久久精品国产精品亚洲艾草网美妙| 久久99热这里只频精品6| 久久亚洲国产精品一区二区| 麻豆av久久av盛宴av| 人妻无码精品久久亚瑟影视| 国产成人综合久久精品尤物| 久久成人国产精品| 中文字幕久久久久人妻| 一本大道久久东京热无码AV| 久久99精品久久久久久秒播| 久久精品这里热有精品| 精品国产乱码久久久久久1区2区| 久久天天躁狠狠躁夜夜不卡| 四虎久久影院| 亚洲精品成人久久久| 久久久黄色大片| 久久综合久久综合亚洲| 久久久久久精品免费看SSS| 无码任你躁久久久久久老妇| 亚州日韩精品专区久久久| 久久精品亚洲精品国产欧美| 久久久久久亚洲精品无码| 日本精品一区二区久久久|