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

隨筆-341  評論-2670  文章-0  trackbacks-0
    上一篇文章中我們看到了可配置語法分析器使用起來的樣子,在這篇文章中我將告訴大家如何通過重載操作符的方法構造文法表達式樹,從而使用遞歸向下法進行語法分析的工作。

    在這之前我們將研究一下什么是文法表達式。我們將文法表達式看成分析器,于是復雜的文法表達式就是由簡單的分析器通過各種方法組合起來的復雜分析器。一個分析器有以下幾個屬性:

    1:輸入類型。輸入類型通常是一個字符串的指針還是迭代器什么的,具體類型不重要,重要的是輸入狀態必須能被復制,能跳到下一個元素。當然wchar_t*也滿足這種要求,但是我們為了通用性(譬如可以為你自己的容器擴展出一個輸入迭代器)我們采用類似STL的迭代器的方法,也就是concept(這并沒有包含其技巧,只是概念)來實現。然后庫將為一些基本的東西提供默認的迭代器,譬如IEnumerable<T>(嗯嗯,這不是C#,已經被Vczh Library++實現了。容器采用了一種泛型+接口的方法,但是在不必要的情況下允許不支付虛函數的代價,不過這根本章內容無關,以后再談),或者WString和AString。

    2:輸出類型。輸出類型一般包含兩個方面。第一個是成功后的結果,第二個是失敗后的錯誤信息。怎么讓可配置語法分析器在恰當的地方輸出類型也是一個很復雜的問題,不過這根本章內容無關,下一篇文章接著講這個細節。在這里我們先忽略錯誤信息,就如同正則表達式拒絕匹配一個字符串也不會告訴你為什么一樣。

    我們可以通過這兩種屬性來構造出一個文法表達式的基類。表達式樹通常用基類+若干子類的方法來實現,有了基類等于定下了子類的基調。
1 template<typename I, typename O>
2 class Expression
3 {
4 public:
5   virtual Maybe<O> Parse(I& input)=0;
6 };

    Maybe指的是里面可以有類型O的值,或者什么都沒有。這額外的信息可以添加一個bool來表達,這里就不贅敘了。到了這里我們明白一個表達式樹的重點不是其內容,而是分析輸入的算法。因此我們可以組合出連接、分支和循環:
 1 template<typename I, typename O1, typename O2>
 2 class Sequence : public Expression<I, ParsingPair<O1, O2>>;
 3 {
 4 public:
 5   Ptr<Expression<I, O1>> left;
 6   Ptr<Expression<I, O2>> right;
 7 
 8   Maybe<ParsingPair<O1, O2>> Parse(I& input);
 9 };
10 
11 template<typename I, typename O>
12 class Alternate : public Expression<I, O>;
13 {
14 public:
15   Ptr<Expression<I, O>> left;
16   Ptr<Expression<I, O>> right;
17 
18   Maybe<O> Parse(I& input);
19 };
20 
21 template<typename I, typename O>
22 class Loop : public Expression<I, ParsingList<O>>;
23 {
24 public:
25   Ptr<Expression<I, O>> element;
26   int min;
27   int max;
28 
29   Maybe<ParsingList<O>> Parse(I& input);
30 };

    這就是連接、分支和循環的聲明了。現在我們可以很清楚的了解什么是帶類型的文法了。類型主要指的是輸出類型,而輸入類型肯定是不能變化的。ParsingPair<A, B>就是一個帶兩個數據的結構,而ParsingList<T>是一個鏈表。做成這樣主要是為了在傳遞他們的時候不要做太多浪費的復制工作,在這里我們只需要了解其概念就好了。

    每一種組合都對子文法的類型有著一些要求,譬如說分支要求左右文法表達式的類型是一樣的。而且輸出類型是通過子文法的類型計算而得到的。Ptr<T>是智能指針,在這里使用主要是為了避免復制的時候出現問題。智能指針在這種數據結構下還是十分好用的,反正構造和析構一條文法的效率都是無關緊要的,不要太慢就可以了。

    但是我們如何重載操作符來組合文法表達式呢?其實文法表達式最終產生的結果都是Ptr<Expression<I, O>>,Ptr的操作符重載是不能修改的,所以我們還要一個代理類:
 1 template<typename I, typename O>
 2 class Node
 3 {
 4 public:
 5   Ptr<Expression<I, O>> expression;
 6 };
 7 
 8 template<typename I, typename O>
 9 Node<I, O> operator|(const Node<I, O>& left, const Node<I, O>& right);
10 
11 template<typename I, typename O1, typename O2>
12 Node<I, ParsingPair<O1, O2>> operator+(const Node<I, O1>& left, const Node<I, O2>& right);
13 
14 //除了+以外,還可以繼承*啊,或者干脆寫個loop(node, min, max)什么的
15 template<typename I, typename O>
16 Node<I, ParsingList<O>> operator+(const Node<I, O>& element);

    我們就可以在每一個操作符重載里面將各自Node的expression成員變量拿出來,然后通過構造上面提供的Sequence、Alternate和Loop來構造更加復雜的文法表達式,最后重新裝進一個Node<I, O>里面就行了。

    這就是我們可以將文法寫進C++的小技巧。下一篇文章我們將會了解到表達式的每一個Parse函數內部都做了些什么。
posted on 2009-12-04 23:43 陳梓瀚(vczh) 閱讀(3219) 評論(1)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

評論:
# re: Vczh Library++ 3.0之可配置語法分析器(設計文法表達式) 2009-12-05 06:59 | radar
精辟啊!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美清纯在线制服| 午夜精品久久99蜜桃的功能介绍| 免费久久99精品国产自| 久久国产精彩视频| 久久久伊人欧美| 男男成人高潮片免费网站| 免费影视亚洲| 国产精品a级| 精品成人在线观看| 亚洲免费精彩视频| 亚洲欧美日韩国产一区二区三区 | 99热在这里有精品免费| 日韩视频三区| 亚洲欧美日韩一区二区| 亚洲免费av电影| 亚洲天堂av图片| 久久精品亚洲一区二区三区浴池| 久久久久国产精品一区三寸| 欧美国产第二页| 亚洲一区二三| 欧美h视频在线| 国产精品日日摸夜夜摸av| 韩国亚洲精品| 国产精品99久久不卡二区| 久久精品91| 99国产精品久久久久久久| 久久成人这里只有精品| 欧美黄色免费网站| 国产亚洲一区二区三区| 日韩一级在线观看| 久久免费国产| 一区二区三区国产精品| 久久女同精品一区二区| 国产精品美女| 一本久道久久综合中文字幕| 久久精品国产亚洲高清剧情介绍| 亚洲黄色免费电影| 亚洲欧美一区二区原创| 欧美国产视频日韩| 在线成人h网| 久久久国产成人精品| 中文日韩在线视频| 欧美精品三级在线观看| 在线观看亚洲视频啊啊啊啊| 久久精品国产久精国产思思| av成人免费在线| 欧美精品自拍偷拍动漫精品| 亚洲国产精品99久久久久久久久| 久久激情网站| 欧美影院在线播放| 国产欧美精品一区二区三区介绍 | 夜夜嗨av一区二区三区网站四季av| 久久精品视频在线观看| 国产精品一卡| 午夜免费久久久久| 亚洲天堂成人| 国产精品私人影院| 亚洲综合色视频| 在线一区二区三区做爰视频网站| 欧美经典一区二区| 亚洲精选在线观看| 亚洲激情视频在线| 欧美日韩成人网| 亚洲一级在线| 亚洲一本大道在线| 国产精品国产三级国产普通话蜜臀| 99国产精品久久久久老师| 亚洲黄色尤物视频| 欧美日韩一区成人| 国产精品国产a级| 中文网丁香综合网| 一区二区三区久久网| 国产精品白丝黑袜喷水久久久| 一区二区欧美国产| 亚洲综合国产激情另类一区| 国产一区在线免费观看| 免费久久99精品国产自在现线| 狂野欧美激情性xxxx欧美| 亚洲国产精品99久久久久久久久| 亚洲国产精品t66y| 欧美午夜一区二区| 久久久亚洲影院你懂的| 狂野欧美一区| 亚洲欧美一区二区三区极速播放 | 欧美 日韩 国产在线 | 亚洲欧美视频| 欧美在线视频观看| 影视先锋久久| 亚洲精品视频免费| 国产精品亚洲美女av网站| 久久久噜噜噜久噜久久| 欧美国产一区二区三区激情无套| 中文网丁香综合网| 久久成人精品无人区| 日韩视频中文| 久久xxxx| 亚洲伊人伊色伊影伊综合网| 久久精品国产亚洲5555| 亚洲网站在线播放| 久久精品一区四区| 中文国产成人精品| 久久久久久久久久久久久9999| 日韩视频一区二区三区在线播放免费观看| 99re亚洲国产精品| 极品日韩av| 亚洲午夜日本在线观看| 亚洲欧洲日产国产网站| 亚洲欧美影音先锋| 在线视频日本亚洲性| 久久中文字幕一区二区三区| 香蕉成人久久| 欧美揉bbbbb揉bbbbb| 亚洲第一色在线| 黄色小说综合网站| 亚洲欧美www| 亚洲欧美日韩在线综合| 欧美激情一区二区三区在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品美女久久久久av超清| 亚洲啪啪91| 亚洲日本中文字幕区| 久久综合久久综合久久综合| 久久精品国产99| 国产区精品在线观看| 亚洲一区二区精品在线观看| 在线亚洲免费视频| 欧美日韩的一区二区| 亚洲欧洲日本专区| 亚洲人成在线观看| 蜜臀久久久99精品久久久久久| 韩日视频一区| 欧美中在线观看| 久久国产视频网站| 国产一区二区三区高清播放| 亚洲欧美三级伦理| 香蕉久久精品日日躁夜夜躁| 欧美性理论片在线观看片免费| 日韩午夜黄色| 亚洲午夜精品一区二区| 欧美午夜不卡| 午夜亚洲福利| 久久综合婷婷| 亚洲欧洲日韩综合二区| 欧美freesex8一10精品| 欧美成人午夜激情在线| 亚洲第一页在线| 欧美国产欧美综合| 日韩午夜av电影| 欧美一区二区性| 精品成人一区二区三区| 裸体歌舞表演一区二区| 91久久国产自产拍夜夜嗨| 在线综合亚洲| 国产日本欧美一区二区三区| 久久成人免费网| 亚洲第一狼人社区| 亚洲午夜一级| 国产人成一区二区三区影院| 久久久久久久久久久久久女国产乱| 欧美国产日产韩国视频| 这里只有精品视频| 国产偷国产偷精品高清尤物| 久久综合影音| 一区二区三区高清不卡| 久久久久久久久久久成人| 亚洲欧洲在线观看| 国产精品啊啊啊| 久久久久国色av免费看影院| 91久久中文| 久久久av水蜜桃| 日韩亚洲国产精品| 国产欧美日韩在线播放| 欧美成人中文字幕| 亚洲自拍偷拍一区| 欧美激情亚洲自拍| 久久riav二区三区| 亚洲最新合集| 狠狠色狠狠色综合日日tαg| 欧美精品日韩一区| 欧美一区二区性| 一区二区三区 在线观看视| 久久在线视频| 亚洲欧美日本视频在线观看| 最新国产精品拍自在线播放| 国产精品日韩精品欧美在线| 久热精品视频在线免费观看| 亚洲无线一线二线三线区别av| 蜜臀av国产精品久久久久| 亚洲一级在线| 日韩一二三在线视频播| 在线观看国产一区二区| 国产精品永久在线| 欧美日韩一区二区在线| 免费不卡视频| 久久久久久久久一区二区| 午夜视频久久久久久| 亚洲视频在线免费观看| 亚洲茄子视频| 亚洲黄一区二区三区| 欧美大成色www永久网站婷|