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

            低調(diào)做技術(shù)__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            實現(xiàn)一種解釋性腳本語言(四)

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

            語法分析

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

            語法樹

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

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

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

                value op_exp( TreeNode *node )
                {
                    switch( node->op )
                    {
                        case '+':
                        {
                            /* + 表達(dá)式必然有左右操作數(shù) */
                            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;
                    }
                }

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

            如何整理出語法樹?

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

                那么有了BNF之后,該如何整理出語法樹呢?
                通常,我們的代碼里都會直接有對應(yīng)exp、term、addop之類的函數(shù)。按照我這句話的意
            思,上面抄的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,用于處理重復(fù)和選擇的一些情況---不用管這句話)

                每一個函數(shù)基本上都會返回一個樹節(jié)點,當(dāng)然,該節(jié)點下可能會有很多子節(jié)點。   

            總結(jié)

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

            代碼導(dǎo)讀

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

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

            評論

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

            你的結(jié)構(gòu)沒有考慮語法錯誤的處理辦法。  回復(fù)  更多評論   

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

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

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

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

            亚洲AV日韩精品久久久久久| 精品免费久久久久久久| 精品久久人人爽天天玩人人妻 | 国产精品久久国产精麻豆99网站| 日韩乱码人妻无码中文字幕久久 | 久久国产乱子伦精品免费强| 狠色狠色狠狠色综合久久| 久久久久国产精品三级网| 婷婷五月深深久久精品| 精品久久综合1区2区3区激情| 久久久久久国产a免费观看黄色大片| 一本久久知道综合久久| 久久精品18| 国产成人精品白浆久久69| 欧美一区二区久久精品| 国产精品亚洲综合专区片高清久久久| 尹人香蕉久久99天天拍| 丰满少妇人妻久久久久久4| 欧美午夜精品久久久久免费视| 日本一区精品久久久久影院| 亚洲精品无码久久久久去q | 久久久久亚洲av综合波多野结衣 | 久久人人爽人人精品视频| 无遮挡粉嫩小泬久久久久久久| 久久男人中文字幕资源站| 久久精品国产91久久综合麻豆自制| 久久人人爽人人爽人人片AV不| 国内精品欧美久久精品| 久久99热精品| 成人资源影音先锋久久资源网| 亚洲精品无码久久久久去q| 欧美激情一区二区久久久| 人人狠狠综合88综合久久| 日韩电影久久久被窝网| 色综合久久88色综合天天 | 久久久精品国产亚洲成人满18免费网站| 国产精品99久久精品| 久久精品国产只有精品2020| 国产精品久久久久久久久| 99精品久久精品| 人人狠狠综合久久亚洲88|