青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0

本來說這一篇文章要把構造確定性狀態機和look ahead講完的,當我真正要寫的時候發現東西太多,只好分成兩篇了。上一篇文章說道一個基本的狀態機是如何構造出來的,但是根據第一篇文章的說法,這一次設計的文法是為了直接構造出語法樹服務的,所以必然在執行狀態機的時候就要獲得構造語法樹的一切信息。如果自己開發過類似的東西就會知道,類似LALR這種東西,你可以很容易的把整個字符串分析完判斷他是不是屬于這個LALR狀態機描述的這個集合,但是你卻不能拿到語法分析所走的路徑,也就是說你很難直接拿到那顆分析樹。沒有分析樹肯定是做不出語法樹的。因此我們得把一些信息插入到狀態機里面,才能最終把分析樹(并不一定真的要表達成樹,像上一篇文章的“分析路徑”(其實就是分析樹的一種可能的表達形式)所確定的語法樹構造出來。

就像《構造正則表達式引擎》一般給狀態機添加信息的方法,就是把一些附加的數據加到狀態與狀態之間的跳轉箭頭里面去。為了形象的表達這個事情,我就拿第一篇文章的四則運算式子來舉例。在這里我為了大家方便,重復一下這個文法的內容(除去了語樹書聲明):

token NAME = "[a-zA-Z_]/w*";
token NUMBER = "/d+(./d+)";
token ADD = "/+";
token SUB = "-";
token MUL = "/*";
token DIV = "//";
token LEFT = "/(";
token RIGHT = "/)";
token COMMA = ",";

rule NumberExpression Number
        = NUMBER : value;

rule FunctionExpression Call
        = NAME : functionName "(" [ Exp : arguments { "," Exp : arguments } ] ")";

rule Expression Factor
        = !Number | !Call;

rule Expression Term
        = !Factor;
        = Term : firstOperand "*" Factor : secondOperand as BinaryExpression with { binaryOperator = "Mul" };
        = Term : firstOperand "/" Factor : secondOperand as BinaryExpression with { binaryOperator = "Div" };

rule Expression Exp
        = !Term;
        = Exp : firstOperand "+" Term : secondOperand as BinaryExpression with { binaryOperator = "Add" };
        = Exp : firstOperand "-" Term : secondOperand as BinaryExpression with { binaryOperator = "Sub" };

那么我們把這個文發轉成狀態機之后,要給跳轉加上什么呢?從直覺上來說,跳轉的時候我們會有六種要干的事情:
1、Create:這個文法創建的語法樹節點是某個類型的(區別于在這一刻給這個問法創建一個返回什么類型的語法樹節點)
2、Set:給創建的語法樹節點的某個成員變量設置一個指定的值
3、Assign:給創建的語法樹節點的某個成員變量設置這一次跳轉的符號產生的語法樹節點(譬如說Exp = Exp: firstOperand “+” Term: secondOperand,走Term的時候,一個語法樹節點就會被assign給那個叫做secondOperand的成員變量)
4、Using:使用這一次跳轉的符號產生的語法樹節點來做這次文法的返回值(譬如說Factor = !Number | !Caller這一條)
5、Shift:略
6、Reduce:略

在這里我們并沒有標記整個文法從哪一個非終結符開始,因為在實際過程中,其實分析師可以從任何一個文法開始的。譬如說寫IDE的時候,我們可能在某些情況下僅僅只需要分析一個表達式。所以考慮到每一個非終結符都有可能被用到,因此我們的“Token流開始”和“Token流結束”就會在每一個非終結符的狀態機中都出現。因此在第一步創建Epsilon PDA(下推自動機)的時候,就可以先直接生成。在這里我們拿Exp做例子:

image

雙虛線代表的是Token流和Token流結束,這并不是我們現在關心的事情。在剩下的轉換中,實現是具有輸入的轉換,而虛線則是沒有輸入的轉換(一般稱為epsilon邊)。

在這里我們要明確一個概念——分析路徑。分析路徑代表的是token在“流”過狀態機的時候,狀態是如何跳轉的。因此對于實際的分析過程,分析路徑其實就是分析樹的一種表達形式。而在狀態機里面,分析路徑則代表一條從開始到結尾的可能的路徑。譬如說在這里,分析路徑可以有三條:
$e –> e1 –> e2 –> e$
$e –> e3 –> e8 –> e7 –> e6 –> e5 –> e4 –> e$
$e –> e9 –> e14 –> e13 –> e12 –> e11 –> e10 –> e$

因此我們可以清楚,一條路徑上是不能出現多個create的,否則你就不知道應該創建的是什么了。當然create和using都不能同時出現,using也不能有多個。而且由于create和set都是在描述這個非終結符(在這里是Exp)所創建的語法樹節點的類型和屬性,跟執行他們的時機無關,所以其實在同一條分析路徑里面,create和set放在哪里都沒關系。就譬如說在上面的第二條分析路徑里面,create是在e6->e5里面標記出來的。就算他移動到了e3->e8,做的事情也一樣。反正只要一條路徑上標記了create,那么他在這條路徑被確定之后,就一定會create所指定的具體類型的語法樹節點。這是相當重要的,因為在后面的分析中,我們很可能需要移動create和set的具體位置。

跟上一篇文章說的一樣,接下來的一步就是去除epsilon邊了。結果如下:

image

面對這種狀態機,去除epsilon邊就不能跟處理正則表達式一樣簡單的去除了。首先,所有的終結狀態——也就是所有經過或者不經過epsilon邊之后,通過“Token流結束”符號連接到最后一個狀態的狀態,在這里分別是e2、e6和e12——都是不能刪掉的。而且所有的“Token流開始”和“Token流結束”——也就是圖里面的$轉換——是不能帶有信息的。所以我們就會看到e6后面的信息全部被移動到了e7->e6這條邊上面。由于create和set的流動性,我們這么做對于狀態機的定義完全沒有影響。

到了這里還沒完,因為這個狀態機還是有很多冗余的狀態的。譬如說e8和e14、e7和e13、e2和e6和e12實際上是可以合并的。合并的策略其實十分簡單:

1、如果我們有跳轉e0->e1和e0->e2,并且兩個跳轉所攜帶的token輸入和信息完全一致的話,那么e1和e2就可以合并。
2、如果我們有跳轉e1->e0和e2->e0,并且兩個跳轉所攜帶的token輸入和信息完全一致的話,那么e1和e2就可以合并。

所以對于e8和e14我們是完全可以合并的。那么e7和e13怎么辦呢?根據create和set的流動性,我們只要把這兩個東西挪到他的前面一個或者若干個跳轉去,那這兩個狀態就可以合并了。為了讓算法更加的簡單,我們遇到兩個跳轉類似的時候,總是先挪動create和set,然后再看看是不是真的可以合并。所以這一步處理完之后就會變成下面這個樣子:

image

我們在不改變狀態機語義的情況下,把Exp的三個狀態機最終壓縮成了這個樣子。看過上一篇文章的同學們都知道,下一步就是要把所有的狀態機統統都連接起來了。關于在連接的時候如何具體操作轉換附帶的信息、以及做出一個確定性的下推狀態機的所有事情將在下一篇文章詳細解釋。大家敬請期待。

posted on 2012-12-22 08:28 陳梓瀚(vczh) 閱讀(4952) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 可配置語法分析器開發紀事(四)——構造一個真正能用的狀態機(上) 2012-12-22 21:18 | 陳昱(CY)
最前排膜拜  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品国产三级国产a| 欧美黄色日本| 激情综合在线| 国产麻豆一精品一av一免费| 国产精品久久二区| 国产亚洲一区二区三区在线观看 | 国产日韩一区二区三区在线播放 | 久久综合一区| 亚洲第一视频网站| 模特精品裸拍一区| 亚洲精品一区二区三区樱花| 日韩午夜激情| 久久久www成人免费精品| 老司机精品视频网站| 欧美日韩精品系列| 国产偷国产偷精品高清尤物| 亚洲动漫精品| 在线国产日韩| 久久三级视频| 亚洲人成在线观看| 亚洲视频中文字幕| 麻豆国产精品777777在线| 欧美日韩一区在线观看| 国产一区在线免费观看| 一区二区高清| 欧美成人在线免费视频| 亚洲一区二区毛片| 欧美精品偷拍| 在线免费一区三区| 欧美一区二区大片| 亚洲免费成人av| 免费看av成人| 狠狠久久亚洲欧美专区| 亚洲欧美一区二区视频| 亚洲精品日韩欧美| 欧美第十八页| 亚洲国产精品成人va在线观看| 亚洲欧美福利一区二区| 亚洲欧洲一区二区天堂久久| 久久久久91| 国产视频欧美视频| 欧美一区二区在线免费播放| 亚洲麻豆av| 欧美日韩成人综合在线一区二区| 在线观看日韩国产| 麻豆91精品| 久久久久久网址| 在线不卡欧美| 老司机午夜精品视频在线观看| 亚洲一区二区三区涩| 欧美日韩中文另类| 亚洲视频在线一区观看| 亚洲三级电影全部在线观看高清| 欧美大片在线观看一区二区| 亚洲欧洲视频在线| 91久久精品国产| 欧美日韩欧美一区二区| 一本色道久久综合精品竹菊| 亚洲精品免费在线观看| 欧美极品一区二区三区| 一区二区三区欧美在线| 夜夜嗨av一区二区三区| 国产精品高清免费在线观看| 亚洲免费视频网站| 午夜精品电影| 亚洲国产成人精品女人久久久 | 国产精品亚洲综合久久| 午夜精品久久久99热福利| 99热这里只有精品8| 欧美日韩在线一二三| 亚洲欧美日韩国产一区| 先锋资源久久| 在线日韩成人| 亚洲人www| 国产精品xxxav免费视频| 老鸭窝91久久精品色噜噜导演| 蜜桃av噜噜一区二区三区| 亚洲欧美一区二区激情| 国产欧美日韩精品在线| 久久精品日产第一区二区| 久久久久久91香蕉国产| 亚洲精品一线二线三线无人区| 亚洲人线精品午夜| 国产精品美女久久久久aⅴ国产馆| 亚洲欧美日韩国产中文| 久久久成人网| 亚洲美女免费精品视频在线观看| 制服丝袜亚洲播放| 极品av少妇一区二区| 亚洲国产经典视频| 国产精品无码永久免费888| 久久一区激情| 欧美视频不卡中文| 免费观看日韩av| 欧美午夜片在线观看| 久久久亚洲精品一区二区三区| 欧美成人免费全部观看天天性色| 午夜精品视频在线观看一区二区| 久久综合色天天久久综合图片| 亚洲性图久久| 免费国产自线拍一欧美视频| 亚洲在线中文字幕| 美女精品网站| 久久久久久久91| 国产精品豆花视频| 亚洲国产精品一区二区第一页| 国产精品午夜在线观看| 亚洲国产日韩一区| 激情久久久久| 欧美一区二区三区电影在线观看 | 亚洲一区二区三区视频| 久久精选视频| 欧美一区二区三区视频在线观看| 欧美gay视频| 免费短视频成人日韩| 国产精品永久免费| 中文久久乱码一区二区| 亚洲精品久久7777| 久久综合狠狠综合久久综合88| 久久精品一区二区三区四区| 国产精品极品美女粉嫩高清在线| 91久久久国产精品| 最新成人在线| 欧美sm极限捆绑bd| 欧美激情一区二区三区蜜桃视频 | 亚洲欧美国产制服动漫| 中文精品在线| 欧美日韩视频在线观看一区二区三区| 欧美大片一区二区三区| 狠狠做深爱婷婷久久综合一区| 亚洲欧美久久久久一区二区三区| 亚洲伊人色欲综合网| 欧美午夜宅男影院在线观看| 亚洲乱码日产精品bd| 中文亚洲字幕| 欧美午夜在线一二页| av成人免费在线观看| 一卡二卡3卡四卡高清精品视频| 亚洲欧洲一区二区在线观看| 久久先锋影音av| 欧美二区在线观看| 亚洲激情小视频| 欧美激情va永久在线播放| 亚洲国产精品一区在线观看不卡| 亚洲精品国产欧美| 欧美激情一区二区三区不卡| 亚洲国产精品久久久久婷婷老年 | 国产精品亚洲а∨天堂免在线| 亚洲视频精选| 久久久精品网| 亚洲激情在线播放| 欧美日韩一本到| 亚洲欧美一区二区三区极速播放| 欧美专区日韩视频| 韩国三级电影一区二区| 麻豆成人综合网| 99精品欧美| 久久久夜夜夜| 日韩一区二区精品视频| 国产精品jizz在线观看美国| 亚洲少妇中出一区| 免费亚洲一区二区| 中文在线不卡| 樱花yy私人影院亚洲| 欧美精品在线观看91| 亚洲一区二区三区免费在线观看 | 国产精品第一页第二页第三页| 亚洲一区国产| 欧美二区视频| 午夜在线精品| 韩日视频一区| 国产精品久久久一本精品| 久久精品一本| 99这里只有久久精品视频| 久久精品国产77777蜜臀| 亚洲精品国产精品国自产在线 | 久久成人18免费网站| 亚洲国产91| 国产日韩欧美一区在线| 欧美精品二区三区四区免费看视频| 亚洲视频精品| 最新国产成人在线观看| 欧美在线视频全部完| 一本色道久久综合亚洲精品不| 国产一区二区中文| 国产精品www色诱视频| 欧美aⅴ99久久黑人专区| 新狼窝色av性久久久久久| 亚洲人成精品久久久久| 噜噜噜噜噜久久久久久91 | 欧美日韩视频不卡| 久久免费高清视频| 性欧美大战久久久久久久久| 亚洲日本乱码在线观看| 亚洲欧美电影院| 亚洲精品乱码久久久久| 性欧美超级视频| 制服丝袜亚洲播放| 日韩亚洲视频在线| 亚洲精品久久久久久一区二区|