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

隨筆-91  評(píng)論-137  文章-0  trackbacks-0
上一篇,首先需要修正的是在DFA生成算法中的傳播部分,應(yīng)該需要有個(gè)循環(huán)一直傳播到不能傳播為止,在多次實(shí)驗(yàn)中表明,有些展望符是通過第2,3,4甚至更多次傳播得來的。

應(yīng)此,相應(yīng)的make函數(shù)變成了
    bool LALR1::make()
    {
        vector<LALR1Production> v;
        v.push_back(inputProductions[begin][0]);
        pStart = closure(v);
        pStart->idx = Item::inc();
        context.states.insert(pStart);
        items.push_back(pStart);

        queue<Item*> q;
        q.push(pStart);

        vector<Item*> changes;

        bool bContinue = false;
        while (!q.empty())
        {
            Item* pItem = q.front();
            vector<Production::Item> s;
            symbols(pItem, s);
            select_into(s, vts, compare_production_item_is_vt, push_back_unique_vector<Production::Item>);
            select_into(s, vns, compare_production_item_is_vn, push_back_unique_vector<Production::Item>);
            for (vector<Production::Item>::const_iterator i = s.begin(), m = s.end(); i != m; ++i)
            {
                Item* pNewItem = NULL;
                if (go(pItem, *i, pNewItem))
                {
                    long n = itemIndex(pNewItem);
                    if (n == -1)
                    {
                        pNewItem->idx = Item::inc();
                        q.push(pNewItem);
                        items.push_back(pNewItem);
                        context.states.insert(pNewItem);
                    }
                    else
                    {
                        items[n]->mergeWildCards(pNewItem, bContinue);
                        changes.push_back_unique(items[n]);
                        destruct(pNewItem, has_destruct(*pNewItem));
                        Item_Alloc::deallocate(pNewItem);
                    }
                    edges[pItem].push_back_unique(Edge(pItem, n == -1 ? pNewItem : items[n], *i));
                }
            }
            q.pop();
        }
        while (bContinue)
        {
            vector<Item*> v;
            v.reserve(changes.size());
            bContinue = false;
            for (vector<Item*>::const_iterator i = changes.begin(), m = changes.end(); i != m; ++i)
            {
                vector<Production::Item> s;
                symbols(*i, s);
                for (vector<Production::Item>::const_iterator j = s.begin(), n = s.end(); j != n; ++j)
                {
                    Item* pNewItem = NULL;
                    if (go(*i, *j, pNewItem))
                    {
                        long n = itemIndex(pNewItem);
                        if (n == -1) throw error<const char*>("unknown item", __FILE__, __LINE__);
                        else
                        {
                            items[n]->mergeWildCards(pNewItem, bContinue);
                            v.push_back_unique(items[n]);
                            destruct(pNewItem, has_destruct(*pNewItem));
                            Item_Alloc::deallocate(pNewItem);
                        }
                    }
                }
            }
            changes = v;
        }
    }
在merge函數(shù)中,會(huì)檢測(cè)有沒有新生成的展望符來決定是否繼續(xù)傳播下去。

一個(gè)示例
下面我們用一個(gè)例子來說明LALR1 DFA是如何生成的,首先它的文法如下
S -> L "=" R
  | R "+"
  | R
  ;

L -> "*" R
  |  "id"
  ;

R -> L
  ;
根據(jù)之前的算法,我們先來看自生的部分

首先我們寫出這個(gè)文法的增廣文法
begin -> . S (#)
求取它的閉包得到
begin -> . S
wildCards:

S -> . L "=" R
wildCards:

S -> . R "+"
wildCards:

S -> . R
wildCards:

L -> . "*" R
wildCards:
"=" "+" 
L -> . "id"
wildCards:
"=" "+" 
R -> . L
wildCards:
"+" # 
我們觀察到,其中有5個(gè)可轉(zhuǎn)移的符號(hào),分別為S、L、R、"*"和"id",我們分別用go函數(shù)對(duì)這5個(gè)轉(zhuǎn)移符號(hào)求出新的狀態(tài)

首先用符號(hào)S求出新狀態(tài)
begin -> S
wildCards:
由于這個(gè)狀態(tài)不在原有列表中,應(yīng)此它是一個(gè)新生成的狀態(tài),我們?yōu)樗砑右粭l通過符號(hào)S轉(zhuǎn)移的邊。

接下來用符號(hào)L求出新狀態(tài)
S -> L . "=" R
wildCards:

R -> L
wildCards:
"+" # 
這個(gè)狀態(tài)也不在原有列表中,應(yīng)此它也是一個(gè)新生成的狀態(tài),我們?yōu)樗砑右粭l通過符號(hào)L轉(zhuǎn)移的邊。

然后用符號(hào)R求出新狀態(tài)
S -> R . "+"
wildCards:

S -> R
wildCards:
這個(gè)狀態(tài)也不在原有列表中,應(yīng)此它也是一個(gè)新生成的狀態(tài),我們?yōu)樗砑右粭l通過符號(hào)R轉(zhuǎn)移的邊。

然后用符號(hào)*求出新的狀態(tài)
L -> "*" . R
wildCards:
"=" "+" 
R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 
同樣的它也不在原有的列表中,我們同樣為其添加一條通過符號(hào)*轉(zhuǎn)移的邊。

然后是符號(hào)id的
L -> "id"
wildCards:
"=" "+" 
同樣不在列表中,我們?yōu)槠涮砑右粭l通過符號(hào)id轉(zhuǎn)移的邊。

這樣,從start狀態(tài)轉(zhuǎn)移出來的5條邊就生成好了,下面來看看這5個(gè)新生成的狀態(tài)又會(huì)生成一些什么呢
begin -> S
wildCards:
由第一個(gè)狀態(tài)可知,它沒有任何的邊。

S -> L . "=" R
wildCards:

R -> L
wildCards:
"+" # 
第二個(gè)狀態(tài)則有一個(gè)=的轉(zhuǎn)移,它生成了一個(gè)新狀態(tài)
S -> L "=" . R
wildCards:

R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 

S -> R . "+"
wildCards:

S -> R
wildCards:
第三個(gè)狀態(tài)有一個(gè)+的轉(zhuǎn)移,它生成了一個(gè)新狀態(tài)
S -> R "+"
wildCards:

L -> "*" . R
wildCards:
"=" "+" 
R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 
第四個(gè)狀態(tài)有4個(gè)轉(zhuǎn)移,分別為R、L、*和id

1.通過符號(hào)R轉(zhuǎn)移到新狀態(tài)
L -> "*" R
wildCards:
"=" "+" 

2.通過符號(hào)L轉(zhuǎn)移到新狀態(tài)
R -> L
wildCards:
"+" # "=" 

3.通過*則可轉(zhuǎn)移到它自己

4.通過id轉(zhuǎn)移到第5個(gè)狀態(tài)

第五個(gè)狀態(tài)則沒有任何的轉(zhuǎn)移。

S -> L "=" . R
wildCards:

R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 
第六個(gè)狀態(tài)有4個(gè)轉(zhuǎn)移,分別為R、L、*和id

1.通過符號(hào)R可轉(zhuǎn)移到新狀態(tài)
S -> L "=" R
wildCards:

2.通過符號(hào)L可轉(zhuǎn)移到狀態(tài)9

3.通過符號(hào)*可轉(zhuǎn)移到狀態(tài)4

4.通過符號(hào)id可轉(zhuǎn)移到狀態(tài)5

第6、7、8個(gè)狀態(tài)都沒有任何轉(zhuǎn)移

然后讓我們來看下changes列表里有哪些東西,根據(jù)上一篇的算法可知,所有已存在的狀態(tài)都在changes列表里,應(yīng)此它里面應(yīng)該會(huì)有4、5和9三個(gè)狀態(tài)。

至此,整個(gè)自生的部分完成了,下面我們將其畫成一張圖


下面是傳播部分
在第一次傳播時(shí)changes列表里有3個(gè)狀態(tài),分別對(duì)這3個(gè)狀態(tài)用go函數(shù)求出新的展望符,并把它們合并到原有的狀態(tài)上。

首先看狀態(tài)4,它有4個(gè)狀態(tài)轉(zhuǎn)移符,分別是R、L、*和id

1.通過符號(hào)R可轉(zhuǎn)移到狀態(tài)8,同時(shí)它的展望符如下
L -> "*" R
wildCards:
"=" "+" # 

2.通過符號(hào)L可轉(zhuǎn)移到狀態(tài)9,同時(shí)它的展望符如下
R -> L
wildCards:
"+" # "=" 

3.通過符號(hào)*可轉(zhuǎn)移到它自己,同時(shí)它的展望符如下
L -> "*" . R
wildCards:
"=" "+" # 
R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 

4.通過符號(hào)id可轉(zhuǎn)移到狀態(tài)5,同時(shí)它的展望符如下
L -> "id"
wildCards:
"=" "+" # 

然后我們來看一下狀態(tài)5和9,它們沒有任何狀態(tài)轉(zhuǎn)移符,應(yīng)此它們不會(huì)傳播任何展望符。

現(xiàn)在changes列表里有4個(gè)狀態(tài),分別為8、9、4和5,又由于第8個(gè)狀態(tài)已經(jīng)產(chǎn)生了新的展望符#應(yīng)此需要繼續(xù)傳播

第二次傳播

首先先看狀態(tài)8和9,它們沒有任何狀態(tài)轉(zhuǎn)移符,應(yīng)此它們不會(huì)傳播任何展望符。

然后來看狀態(tài)4,同樣的它有4個(gè)狀態(tài)轉(zhuǎn)移符,分別為R、L、*和id。

1.通過符號(hào)R可轉(zhuǎn)移到狀態(tài)8,同時(shí)它的展望符如下
L -> "*" R
wildCards:
"=" "+" # 

2.通過符號(hào)L可轉(zhuǎn)移到狀態(tài)9,同時(shí)它的展望符如下
R -> L
wildCards:
"+" # "=" 

3.通過符號(hào)*可轉(zhuǎn)移到它自己,同時(shí)它的展望符如下
L -> "*" . R
wildCards:
"=" "+" # 
R -> . L
wildCards:
"+" # "=" 
L -> . "*" R
wildCards:
"=" "+" # 
L -> . "id"
wildCards:
"=" "+" # 

4.通過符號(hào)id可轉(zhuǎn)移到狀態(tài)5,同時(shí)它的展望符如下
L -> "id"
wildCards:
"=" "+" # 

最后我們來看狀態(tài)5,它沒有任何狀態(tài)轉(zhuǎn)移符,應(yīng)此它不會(huì)傳播任何展望符。

現(xiàn)在changes列表里同樣有4個(gè)狀態(tài),分別為8、9、4和5,由于沒有一個(gè)狀態(tài)產(chǎn)生了新的展望符,應(yīng)此它將不會(huì)繼續(xù)傳播下去了。

現(xiàn)在整個(gè)文法的DFA就生成完畢了,讓我們來修改一下原先的那張圖來看看最終的DFA是什么樣的。


整個(gè)示例就先介紹到這里,在接下來的一篇文章中將會(huì)通過幾個(gè)示例來介紹closure和go函數(shù)的原理,希望這種由粗到細(xì)的講解順序能夠被讀者所接受。最后完整的代碼可到http://code.google.com/p/qlanguage下載。
posted on 2013-05-30 23:04 lwch 閱讀(1591) 評(píng)論(2)  編輯 收藏 引用 所屬分類: QLanguage

評(píng)論:
# re: QParserGenerator代碼分析二(A fix&An example) 2013-05-30 23:36 | eryar
圖片看不全……  回復(fù)  更多評(píng)論
  
# re: QParserGenerator代碼分析二(A fix&An example) 2013-05-31 10:12 | lwch
@eryar
這個(gè)好像是模板的問題,改了一下圖片的大小。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黄色工厂这里只有精品| 欧美激情一区二区在线 | 国产精品另类一区| 国产精品男人爽免费视频1| 欧美激情精品久久久六区热门 | 亚洲综合成人婷婷小说| 亚洲国产美女久久久久| 激情久久影院| 国产欧美在线视频| 国产精品夜色7777狼人| 国产精品国产三级国产专播精品人 | 欧美激情在线狂野欧美精品| 久热精品视频在线| 久久精品中文| 久久久久九九视频| 久久婷婷麻豆| 欧美大片一区| 欧美日本亚洲韩国国产| 欧美久久一区| 欧美日韩在线不卡一区| 欧美性猛交xxxx乱大交退制版| 欧美日本不卡视频| 国产精品成人一区二区三区吃奶 | 亚洲欧美国产制服动漫| 中文在线资源观看视频网站免费不卡| 亚洲精品影院在线观看| 亚洲伦理网站| 亚洲午夜伦理| 欧美少妇一区| 国产精品色午夜在线观看| 欧美片第1页综合| 欧美久久久久久久| 欧美色精品在线视频| 国产精品高潮呻吟久久av无限| 欧美午夜影院| 国产欧美韩国高清| 尤妮丝一区二区裸体视频| 精品99一区二区| 亚洲理论在线观看| 亚洲欧美日韩国产综合| 久久精品亚洲热| 欧美电影在线| 99精品久久| 欧美在线91| 欧美成人精品在线播放| 欧美性淫爽ww久久久久无| 国产日韩亚洲| 亚洲精品资源美女情侣酒店| 亚洲综合好骚| 欧美成人午夜激情视频| 一本色道久久99精品综合| 性亚洲最疯狂xxxx高清| 欧美成人一区在线| 国产精品资源| 亚洲日本中文字幕区| 亚洲免费在线| 欧美成人精品福利| 亚洲自拍偷拍视频| 欧美男人的天堂| 韩国三级电影久久久久久| 一区二区三区日韩在线观看| 亚洲欧美电影院| 亚洲尤物视频网| 亚洲国产成人精品久久| 亚洲欧美日韩国产中文| 欧美片在线播放| 亚洲第一主播视频| 欧美一区二区在线| 99精品国产在热久久| 久久夜色精品亚洲噜噜国产mv| 国产精品久久久久久久久借妻| 国产精品日韩欧美一区| 国外成人在线视频| 欧美亚洲网站| 欧美福利在线| 亚洲自拍偷拍网址| 欧美激情第4页| 韩国av一区| 中文在线资源观看视频网站免费不卡| 亚洲主播在线| 亚洲国产成人在线播放| 麻豆成人综合网| 欧美日韩天天操| 亚洲第一区在线| 美女91精品| 国产偷国产偷亚洲高清97cao| 一本色道久久综合亚洲精品高清| 久久婷婷av| 免费影视亚洲| 国产精品乱码| 一区二区三区四区蜜桃| 浪潮色综合久久天堂| 欧美在线视频a| 欧美激情一区二区| 悠悠资源网亚洲青| 国产农村妇女精品| 亚洲婷婷在线| 一区二区欧美视频| 国产精品theporn| 亚洲视频第一页| 亚洲另类自拍| 欧美新色视频| 亚洲在线视频观看| 亚洲一区二区高清| 国产一区二区精品久久91| 久久久免费精品| 久久久国产成人精品| 永久免费视频成人| 亚洲成人在线视频播放 | 欧美二区不卡| 久久久免费精品视频| 伊人婷婷久久| 亚洲国产91色在线| 国产精品成av人在线视午夜片| 香蕉久久精品日日躁夜夜躁| 性做久久久久久久久| 亚洲国产精品久久久| 日韩小视频在线观看| 国产欧美精品在线| 欧美韩日视频| 国产精品久久网| 欧美xart系列高清| 欧美偷拍一区二区| 亚洲人成人99网站| 欧美另类亚洲| 一区二区亚洲欧洲国产日韩| 亚洲日本乱码在线观看| 亚洲视频免费观看| 9色porny自拍视频一区二区| 亚洲激情成人在线| 亚洲国产成人porn| 伊人久久婷婷色综合98网| 欧美性做爰猛烈叫床潮| 男女精品网站| 欧美黄色精品| 久久免费少妇高潮久久精品99| 这里只有精品电影| 99精品国产福利在线观看免费| 国产乱码精品一区二区三| 国产精品一区一区三区| 国产日韩精品一区| 午夜精品www| 国产精品国码视频| 欧美日韩三区四区| 另类av导航| 亚洲韩日在线| 欧美在线高清| 小黄鸭精品aⅴ导航网站入口| 久久亚洲精选| 久久成人18免费网站| 欧美理论在线播放| 欧美成年人视频网站| 国产欧美亚洲一区| 99精品免费| 99国产精品久久久久久久久久 | 在线视频欧美一区| 女生裸体视频一区二区三区| 欧美在线免费观看| 欧美日韩一区二区三区高清| 欧美丰满少妇xxxbbb| 红桃视频欧美| 欧美伊人久久| 欧美在线视频全部完| 国产精品久久久久久久久借妻 | 99国产成+人+综合+亚洲欧美| 18成人免费观看视频| 蜜乳av另类精品一区二区| 国产精品一区二区三区四区五区| 日韩亚洲欧美一区| 国产精品99久久久久久久女警| 欧美国产日韩在线| 亚洲电影免费| 亚洲欧洲在线一区| 蜜臀久久99精品久久久画质超高清| 久久人人97超碰人人澡爱香蕉| 国产欧美精品在线播放| 最新成人av在线| 国产亚洲在线观看| 久久久精品一区| 美女黄色成人网| 久久婷婷综合激情| 精久久久久久| 欧美一区二区大片| 亚洲精品在线观看免费| 最近看过的日韩成人| 亚洲欧美99| 91久久国产自产拍夜夜嗨| 国产精品国产三级国产专播精品人| 久久久久欧美精品| 一本色道久久综合亚洲精品婷婷| 久久久久国色av免费观看性色| 亚洲欧洲一区二区三区久久| 国产伦精品一区二区三区高清版| 模特精品裸拍一区| 欧美在线观看视频一区二区三区| 亚洲伦理精品| 亚洲第一页在线| 久久亚洲精品伦理| 羞羞答答国产精品www一本| 99国产精品久久久久久久久久|