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

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

上一篇文章對大部分文法都構造出了一個使用的狀態機了,這次主要來講右遞歸的情況。右遞歸不像左遞歸那么麻煩,因為大部分右遞歸寫成循環也不會過分的讓語法樹變得難以操作,不過仍然有少數情況是我們仍然希望保留遞歸的語法樹形狀,譬如C++的連等操作,因此這里就來講一下這個問題。

右遞歸是怎么形成的呢?在這里我們先不想這個問題,我們來看一個普通的文法。在上一篇文章我們已經說過了,如果一條文法有一個非終結符引用了另一條文法,那么就要做一條shift和reduce來從這個狀態機穿插到那個狀態機上:

image

 

在這里需要講一下,綠色的箭頭是shift,紫色的箭頭是reduce,他們都是ε邊。更進一步說,如果A剛好以B作為結尾,那么A的最后一個輸入就不是終結符輸入,不過因為她不是右遞歸,所以現在看起來還沒什么問題:

image

我們已經接近右遞歸的形狀了。右遞歸的一個根本特征當然是遞歸(廢話)。為了制作一個右遞歸,我們可以想一下,如果A和B不是兩個rule而是同一個rule會怎么樣?當然咋這么一看,好像就是A可以訪問自己了:

image

實際上這已經構成了一個ε邊的循環。左遞歸是shift的循環,右遞歸是reduce的循環,其實他們都一樣。那你可能會想,既然左遞歸和右遞歸只是相反的情況,為什么左遞歸處理起來就那么容易,右遞歸好像就沒什么方法呢?其實如果你只是想要檢查一個字符串是不是一個文法的其中一個元素而不建立語法樹的話,你完全可以把這條循環的ε reduce邊給壓縮成一條。為什么呢?在之前講到,我們可以判斷一個reduce是不是由左遞歸造成的,我們也可以判斷一個shift是不是由右遞歸造成的。這種shift只要不壓狀態進棧,那么右遞歸的reduce循環不管循環多少次,其實都是pop一個狀態出來,于是問題就沒有了。等價地,不處理語法樹的話,其實左遞歸也可以用相同的方法處理。

但是一旦當你涉及到創建語法樹的問題,你就等于給每一條邊都加上了一些semantic actions。這個時候shift和reduce就不是簡單地可以互相抵消的關系了,于是你就不能把一個循環的ε reduce邊壓縮成一條,那怎么辦呢?

方法其實很簡單,只要我們在狀態機走著走著發現無路可走的時候,看看有沒有一條右遞歸reduce可以給我們“試一試”就好了。為什么可以這樣做呢?我們還記得,當我們把整個狀態及壓縮到沒有ε邊的時候,每一個輸入都需要對堆棧的情況進行一次匹配。令人欣慰的事,沒有什么邊可以跟右遞歸的reduce邊一樣產生同樣的匹配結構(但是我不想在這里證明),所以這樣做是安全的。

到了這里,我們已經把構造不帶lookahead狀態機的所有情況都說清楚了。一個文法如果需要構造lookahead的話,其實就等于在邊的匹配規則里面加上一條對未來的一些token的要求,并沒有本質上改變語法分析的結構。但是我們知道,還有兩種上下文無關文法是不在這里面的,C語言全占了。我在這里舉兩個簡單的例子:

變量聲明:對于一個已經typedef過的結構我們完全可以寫出這樣的代碼:A*B;。這個時候A如果是類型,那這就需要走VariableDeclarationStatement的rule。如果A是一個表達式,那這就需要走ExpressionStatement的rule。但是對于語法分析來說,A就是一個簡單的token(除了typedef過的類型以外,所有C語言的類型都是以關鍵字開頭的,所以如果你們想做簡單的C語言的parser,就去掉typedef吧,啊哈哈哈哈),在語法分析的時候是無法做出預測的。

這種時候有兩種方法,第一種是準備更加豐富的semantic actions,讓符號表可以在parse的時候構造出來。那到了這里,我們根據A究竟是不是一個類型,就可以賺到不同的分支上了。另一種就是,我們保留一個AmbiguousStatement的語法樹節點,把語法樹的一顆子樹遇到的不能處理的歧義的情況都寫進去。我們可能回想,為什么我們不干脆一個parser返回多個分析結果呢?因為如果不這么做的話,一個函數里面有10個這樣子的變量聲明,那你就有1024個結果了。如果我們把歧義收縮到一顆子樹上,那其實還是1個結果,只是多了10顆子樹,效果完全不同。

強制類型轉換:寫C語言的時候是不可能沒有強制類型轉換的,但是當parser看到類似這樣的代碼的時候:(A*****)B,因為類型的結構和表達式的結構是不一樣的,但是你這個時候并不能在看到“(”的時候就做lookahead——因為這個lookahead是無限長的,括號里面的表達式或者類型都可以無限長。不過就算你想把他局限成有限長,就算你給100個token,那也會長出成千上萬種lookahead的模式,所以在這里我們就不要用lookahead了。

那怎么做呢?我們只需要把這個狀態機當成NDA(因為到了這里他已經是NDA了),從deterministic push-down automaton變成了non-deterministic push-down automaton,我們也唯有讓我們的parser也變成non-deterministic了。關于這個內容,就等到下一篇——也就是這個系列的最后一篇文章——來詳細講解了。

posted on 2013-04-12 17:48 陳梓瀚(vczh) 閱讀(6543) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 可配置語法分析器開發紀事(六)——構造一個真正能用的狀態機(下)[未登錄] 2015-03-14 01:45 | ice
...NDA就是寫成帶回溯的解析器么?....  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            夜夜嗨av色一区二区不卡| 夜夜精品视频一区二区| 香蕉久久一区二区不卡无毒影院| 欧美区一区二| 国产精品99久久久久久久vr| 亚洲国产精品久久久久秋霞蜜臀| 久久天天躁狠狠躁夜夜爽蜜月| 国产午夜精品久久| 久久精品视频在线看| 久久久精品tv| 亚洲国产欧美久久| 91久久国产综合久久| 欧美日韩国产综合网| 午夜精品久久久久久久99黑人| 亚洲素人在线| 国产一区二区三区在线播放免费观看| 久久这里有精品视频| 免费亚洲一区| 亚洲欧美日韩系列| 欧美一区二区视频在线观看| 在线观看亚洲a| 亚洲精品久久久一区二区三区| 国产精品vvv| 久久人人97超碰国产公开结果| 久久婷婷av| 亚洲午夜视频在线观看| 性一交一乱一区二区洋洋av| 亚洲国产另类久久精品| 亚洲精品在线观看免费| 国产亚洲精品美女| 亚洲国产精品精华液网站| 国产精品久久九九| 欧美黄色大片网站| 国产精品日韩欧美| 欧美成人免费小视频| 国产精品久久久久久亚洲毛片| 老巨人导航500精品| 欧美精品国产一区| 久久亚洲综合色一区二区三区| 欧美精品91| 久久综合电影一区| 国产精品www| 欧美国产日韩一区二区| 国产农村妇女精品一二区| 91久久中文字幕| 含羞草久久爱69一区| 在线中文字幕一区| 亚洲人成在线播放| 久久精品av麻豆的观看方式| 亚洲午夜精品久久| 欧美成人免费观看| 美女日韩欧美| 国产亚洲欧美日韩一区二区| 一二美女精品欧洲| 99v久久综合狠狠综合久久| 久久精品国产77777蜜臀| 亚洲一区中文| 欧美日韩色婷婷| 亚洲电影免费观看高清| 精品福利av| 久久9热精品视频| 欧美一区二区三区在线观看| 欧美人与禽猛交乱配视频| 欧美激情亚洲一区| 亚洲国产精品久久91精品| 久久se精品一区精品二区| 久久超碰97人人做人人爱| 国产精品视频yy9099| 一区二区国产精品| 亚洲已满18点击进入久久| 欧美日韩免费看| 亚洲免费黄色| 在线视频精品| 欧美性事在线| 亚洲一区二区三区精品视频| 亚洲在线免费视频| 国产精品日韩久久久久| 亚洲欧美日韩国产一区二区三区| 亚洲欧美日韩成人| 国产日产欧产精品推荐色| 欧美一级电影久久| 老司机一区二区三区| 在线观看国产精品淫| 免费成人黄色av| 亚洲三级色网| 午夜一区在线| 韩国三级在线一区| 男女精品网站| 日韩一级片网址| 欧美专区亚洲专区| 黄网站免费久久| 欧美寡妇偷汉性猛交| 一本色道久久综合狠狠躁的推荐| 亚洲永久在线| 国内欧美视频一区二区| 免费在线亚洲欧美| 在线午夜精品自拍| 久久经典综合| 亚洲美洲欧洲综合国产一区| 欧美午夜精品伦理| 欧美影院成人| 亚洲精品老司机| 性做久久久久久免费观看欧美 | 亚洲精品视频在线看| 亚洲尤物视频在线| 国内精品亚洲| 欧美体内谢she精2性欧美 | 久久综合九色综合久99| 亚洲国产婷婷综合在线精品| 欧美日韩在线视频观看| 亚洲男女自偷自拍图片另类| 久久婷婷影院| 亚洲视频在线一区| 激情亚洲网站| 国产精品视频一二三| 麻豆国产精品777777在线| 亚洲伊人久久综合| 亚洲国产成人一区| 久久久久久久999| 亚洲一区二区三区在线观看视频| 国模私拍一区二区三区| 欧美三区在线| 牛牛影视久久网| 亚洲综合电影| 日韩视频免费在线| 欧美国产日本高清在线| 久久精品一区| 亚洲在线观看免费| aⅴ色国产欧美| 亚洲精美视频| 1024欧美极品| 国产性色一区二区| 欧美性猛交xxxx乱大交退制版| 美女视频黄 久久| 欧美与欧洲交xxxx免费观看| 在线视频欧美日韩| 亚洲精品久久久久久久久久久久| 久久久亚洲一区| 性高湖久久久久久久久| 在线视频日韩| 亚洲另类自拍| 亚洲欧洲在线一区| 亚洲国产精品激情在线观看| 狠狠入ady亚洲精品经典电影| 国产精品一区免费观看| 欧美视频日韩视频| 欧美日韩高清在线| 欧美精品久久一区二区| 欧美黄色小视频| 欧美精品不卡| 欧美日韩三级| 欧美视频亚洲视频| 国产精品电影观看| 国产精品色婷婷| 国产日韩欧美一区二区三区在线观看 | 久久亚洲精品中文字幕冲田杏梨| 亚洲欧美在线另类| 校园春色综合网| 欧美中文字幕久久| 久久视频在线视频| 嫩模写真一区二区三区三州| 欧美成人午夜激情视频| 欧美黄色片免费观看| 亚洲黄色av一区| 一区二区三区日韩精品视频| 亚洲一线二线三线久久久| 午夜精品久久久久久久久久久久久 | 久久精品视频免费| 蜜桃精品久久久久久久免费影院| 欧美成人精品一区二区| 亚洲剧情一区二区| 亚洲女人小视频在线观看| 久久成人资源| 欧美大尺度在线观看| 国产精品多人| 韩国av一区二区三区四区| 亚洲精品久久久久久久久久久久久| 一本色道久久综合亚洲精品不卡| 亚洲欧美日韩视频二区| 免费不卡欧美自拍视频| 亚洲毛片一区| 欧美在线黄色| 欧美日韩精品| 国产亚洲精品高潮| 日韩一级大片在线| 久久久久久网址| 亚洲精品视频免费| 久久激情中文| 欧美性一二三区| 在线观看三级视频欧美| 亚洲影院色无极综合| 免费在线看成人av| 亚洲一区二区在线免费观看视频| 久久九九精品99国产精品| 欧美日韩午夜精品| 亚洲高清视频的网址| 欧美一区二区三区啪啪 | 亚洲视频专区在线| 欧美va亚洲va香蕉在线| 亚洲尤物影院|