• <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 閱讀(3644) 評論(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】  回復  更多評論   

            精品免费tv久久久久久久| 久久久久久亚洲精品影院| 国内精品久久久久久99蜜桃| 好久久免费视频高清| 久久精品成人免费国产片小草| 日韩电影久久久被窝网| AV色综合久久天堂AV色综合在| 久久国产福利免费| 久久国产高潮流白浆免费观看| 狠狠色伊人久久精品综合网| 人妻精品久久无码专区精东影业 | 久久婷婷色香五月综合激情| 亚洲精品国产字幕久久不卡| 久久www免费人成看国产片| 亚洲精品无码久久久久去q| 国产精品成人99久久久久| 久久久久久亚洲精品成人 | 久久男人AV资源网站| 婷婷五月深深久久精品| 污污内射久久一区二区欧美日韩| 久久精品成人国产午夜| 亚洲日韩中文无码久久| 欧美久久综合九色综合| 国内精品久久久久久中文字幕| 欧美va久久久噜噜噜久久| 亚洲欧美另类日本久久国产真实乱对白| 久久综合九色综合97_久久久| 久久亚洲精品人成综合网| 久久人人爽人人爽人人片av麻烦| 久久综合久久鬼色| 久久精品亚洲精品国产欧美| 国产精品欧美久久久久无广告| 狠狠干狠狠久久| 久久亚洲精品视频| 日本三级久久网| 久久久久人妻精品一区三寸蜜桃| 99久久国产综合精品网成人影院| 青草影院天堂男人久久| 99久久精品国产一区二区蜜芽| 国产成人精品久久亚洲高清不卡| 99久久精品免费观看国产|