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

隨筆-91  評論-137  文章-0  trackbacks-0
本文的思路來源于http://m.shnenglu.com/vczh/archive/2008/05/21/50656.html

首先先看代碼:
  1 #include <stdio.h>
  2 
  3 class Element
  4 {
  5 public:
  6     Element() : start(0),length(0){}
  7 
  8     int start;
  9     int* data;
 10     int length;
 11 };
 12 
 13 template<class T>
 14 class Fail
 15 {
 16 public:
 17     int Parser(T& s)
 18     {
 19         return 0;
 20     }
 21     
 22     bool same(T s1,T s2)
 23     {
 24         for(int i=s1.start;i<s2.length;i++)
 25             if(s1.data[i] != s2.data[i])
 26                 return false;
 27         return true;
 28     }
 29 };
 30 
 31 template<class T>
 32 class Ch : public Fail<T>
 33 {
 34 public:
 35     int Parser(T& s1,T s2)
 36     {
 37         Fail<T> t;
 38         if(s1.length >= s2.length)
 39             if(same(s1,s2))
 40             {
 41                 s1.start += s2.length;
 42                 return s2.length;
 43             }
 44         return t.Parser(s1);
 45     }
 46 };
 47 
 48 template<class T>
 49 class Seq : public Fail<T>
 50 {
 51 public:
 52     int Parser(T& s1,T s2,T s3)
 53     {
 54         Fail<T> t;
 55         Ch<T> ch1,ch2;
 56         int n1 = ch1.Parser(s1,s2);
 57         int n2 = ch2.Parser(s1,s3);
 58         if(n1 && n2) return n1 + n2;
 59         else return t.Parser(s1);
 60     }
 61 };
 62 
 63 template<class T>
 64 class Alt : public Fail<T>
 65 {
 66 public:
 67     int Parser(T& s1,T s2,T s3)
 68     {
 69         Fail<T> t;
 70         Ch<T> ch1,ch2;
 71         int n1 = ch1.Parser(s1,s2);
 72         int n2 = ch2.Parser(s1,s2);
 73         if(n1) return n1;
 74         else if(n2) return n2;
 75         else return t.Parser(s1);
 76     }
 77 };
 78 
 79 template<class T,int max>
 80 class Any : public Fail<T>
 81 {
 82 public:
 83     int Parser(T& s1,T s2)
 84     {
 85         Fail<T> t;
 86         for(int i=0;i<max;i++)
 87             if(!same(s1,s2))
 88                 return t.Parser(s1);
 89         return s2.length * max;
 90     }
 91 };
 92 
 93 void main()
 94 {
 95     Element s1;
 96     Element s2,s3;
 97     s1.data = new int[6];
 98     s1.length = 6;
 99     s1.data[0= 0;
100     s1.data[1= 1;
101     s1.data[2= 2;
102     s1.data[3= 3;
103     s1.data[4= 4;
104     s1.data[5= 5;
105     s2.data = new int[1];
106     s2.length = 1;
107     s2.data[0= 0;
108     s3.data = new int[1];
109     s3.length = 1;
110     s3.data[0= 1;
111     
112     // Seq Test
113     Seq<Element> seq;
114     int n = seq.Parser(s1,s2,s3);
115     printf("Seq is:%d\n",n);
116     
117     // Alt Test
118     s1.start = 0;
119     Alt<Element> alt;
120     n = alt.Parser(s1,s2,s3);
121     printf("Alt is:%d\n",n);
122     
123     // Any Test
124     s1.start = 0;
125     s1.data[1= 0;
126     Any<Element,2> any;
127     n = any.Parser(s1,s2);
128     printf("Any is:%d\n",n);
129     
130     delete[] s1.data;
131     delete[] s2.data;
132     delete[] s3.data;
133 }

Element可理解為字符串結構,其中的start成員變量表示輸入串當前分析到的指針.

我們首先需要一個Fail,這個對象表示分析失敗,無論輸入是什么都返回0.
 1 template<class T>
 2 class Fail
 3 {
 4 public:
 5     int Parser(T& s)
 6     {
 7         return 0;
 8     }
 9     
10     bool same(T s1,T s2)
11     {
12         for(int i=s1.start;i<s2.length;i++)
13             if(s1.data[i] != s2.data[i])
14                 return false;
15         return true;
16     }
17 };
same函數(shù)用于分析輸入串s1與待驗證串s2是否完全匹配.

然后我們需要一個Ch,這個對象分析輸入串和待匹配串是否相同.
 1 template<class T>
 2 class Ch : public Fail<T>
 3 {
 4 public:
 5     int Parser(T& s1,T s2)
 6     {
 7         Fail<T> t;
 8         if(s1.length >= s2.length)
 9             if(same(s1,s2))
10             {
11                 s1.start += s2.length;
12                 return s2.length;
13             }
14         return t.Parser(s1);
15     }
16 };
比如輸入串為"abcdefg",匹配串為"abc",則Parser("abcdefg","abc")返回"abc"的長度3,如果匹配失敗則返回0.

然后我們需要一個Seq,這個對象分析輸入串和多個待匹配的連接串是否匹配,這里我們簡單設為2個待匹配串.
 1 template<class T>
 2 class Seq : public Fail<T>
 3 {
 4 public:
 5     int Parser(T& s1,T s2,T s3)
 6     {
 7         Fail<T> t;
 8         Ch<T> ch1,ch2;
 9         int n1 = ch1.Parser(s1,s2);
10         int n2 = ch2.Parser(s1,s3);
11         if(n1 && n2) return n1 + n2;
12         else return t.Parser(s1);
13     }
14 };
比如輸入串為"abcdefg",匹配串為"ab"和"cd",則Parser("abcdefg","ab","cd")返回"abcd"的長度4,如果匹配失敗則返回0.

然后是Alt,這個對象分析輸入串和多個待匹配串中的一個是否匹配,這里我們也簡單的設為2個待匹配串.
 1 template<class T>
 2 class Alt : public Fail<T>
 3 {
 4 public:
 5     int Parser(T& s1,T s2,T s3)
 6     {
 7         Fail<T> t;
 8         Ch<T> ch1,ch2;
 9         int n1 = ch1.Parser(s1,s2);
10         int n2 = ch2.Parser(s1,s2);
11         if(n1) return n1;
12         else if(n2) return n2;
13         else return t.Parser(s1);
14     }
15 };
比如輸入串為"abcdefg",匹配串為"ab"和"cd",則Parser("abcdefg","ab","cd")返回"ab"的長度2,如果匹配失敗則返回0.

最后是Any,這個對象分析輸入串和一個待匹配串的循環(huán)是否匹配.
 1 template<class T,int max>
 2 class Any : public Fail<T>
 3 {
 4 public:
 5     int Parser(T& s1,T s2)
 6     {
 7         Fail<T> t;
 8         for(int i=0;i<max;i++)
 9             if(!same(s1,s2))
10                 return t.Parser(s1);
11         return s2.length * max;
12     }
13 };
比如輸入串為"ababefg",匹配串為"ab",max=2,則Parser("abcdefg","ab")返回"ab"的長度2*2,如果匹配失敗則返回0.

然后我們來測試一下:
 1 void main()
 2 {
 3     Element s1;
 4     Element s2,s3;
 5     s1.data = new int[6];
 6     s1.length = 6;
 7     s1.data[0= 0;
 8     s1.data[1= 1;
 9     s1.data[2= 2;
10     s1.data[3= 3;
11     s1.data[4= 4;
12     s1.data[5= 5;
13     s2.data = new int[1];
14     s2.length = 1;
15     s2.data[0= 0;
16     s3.data = new int[1];
17     s3.length = 1;
18     s3.data[0= 1;
19     
20     // Seq Test
21     Seq<Element> seq;
22     int n = seq.Parser(s1,s2,s3);
23     printf("Seq is:%d\n",n);
24     
25     // Alt Test
26     s1.start = 0;
27     Alt<Element> alt;
28     n = alt.Parser(s1,s2,s3);
29     printf("Alt is:%d\n",n);
30     
31     // Any Test
32     s1.start = 0;
33     s1.data[1= 0;
34     Any<Element,2> any;
35     n = any.Parser(s1,s2);
36     printf("Any is:%d\n",n);
37     
38     delete[] s1.data;
39     delete[] s2.data;
40     delete[] s3.data;
41 }

結果為:
1 Seq is:2
2 Alt is:1
3 Any is:2

以上就是簡單的面向組合子測試了.
posted on 2011-01-22 17:11 lwch 閱讀(1663) 評論(4)  編輯 收藏 引用 所屬分類: NScript

評論:
# re: 面向組合子的一些測試 2011-01-22 21:52 | 濰坊seo
可以交換個鏈接嗎?  回復  更多評論
  
# re: 面向組合子的一些測試 2011-01-23 03:51 | 陳梓瀚(vczh)
還差一部分的精髓啊,你還是要試試看拿你這個東西做四則運算表達是分析器哈。  回復  更多評論
  
# re: 面向組合子的一些測試 2011-01-23 16:53 | lwch
@陳梓瀚(vczh)
的確..沒有理解組合這個概念..  回復  更多評論
  
# re: 面向組合子的一些測試 2011-01-23 17:25 | 陳梓瀚(vczh)
@lwch
http://m.shnenglu.com/vczh/archive/2010/04/28/113836.html

這個才是我用C++寫的組合字。你看的那個是我用我大二的時候設計的一門動態(tài)語言寫的。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美在线免费| 久久久女女女女999久久| 欧美一区三区三区高中清蜜桃| 欧美日韩精品一区二区三区| 亚洲免费成人av电影| 亚洲精品免费网站| 欧美xx视频| 99在线精品视频在线观看| 日韩视频专区| 国产精品嫩草久久久久| 久久国产婷婷国产香蕉| 久久琪琪电影院| 亚洲久色影视| 日韩一级大片| 国产精品日本精品| 老司机久久99久久精品播放免费 | 久久久精品999| 噜噜噜久久亚洲精品国产品小说| 欧美视频不卡| 久久国产免费看| 欧美11—12娇小xxxx| 欧美激情女人20p| 久久不射中文字幕| 国产精品第一区| 中国日韩欧美久久久久久久久| 欧美成人精品在线视频| 中文日韩在线| 欧美午夜精品久久久| 国产日韩欧美成人| 欧美一区亚洲| 午夜精品电影| 国产日产亚洲精品系列| 亚洲欧美综合国产精品一区| av成人国产| 欧美性生交xxxxx久久久| 中文一区在线| 一区二区成人精品 | 亚洲欧美在线一区二区| 欧美性jizz18性欧美| 亚洲一区黄色| 亚洲天堂久久| 国产伦一区二区三区色一情| 欧美一区二区三区久久精品茉莉花| 亚洲一区二区在| 国产精品区二区三区日本| 亚洲欧美网站| 久久激情视频久久| 亚洲国产福利在线| 亚洲人成毛片在线播放| 欧美女同在线视频| 香蕉尹人综合在线观看| 香蕉久久夜色| 亚洲欧洲一级| 亚洲手机视频| 国产精品久在线观看| 亚洲精品一级| 亚洲视频免费观看| 国产亚洲一区精品| 亚洲成人中文| 国产精品麻豆欧美日韩ww| 久久精品国产99| 久久综合网络一区二区| 夜夜嗨av一区二区三区四区| 亚洲国产一区二区三区在线播 | 在线综合亚洲| 午夜精品一区二区三区在线播放| 一区免费观看视频| 亚洲黄一区二区| 国产精品久久久久久久第一福利 | 亚洲国产精品成人va在线观看| 欧美激情按摩在线| 一区二区高清视频| 欧美一级久久| 日韩一区二区精品| 亚洲美女视频在线观看| 国产欧美精品一区二区色综合| 免费欧美在线| 欧美日本中文字幕| 久久精品国产亚洲5555| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧洲精品成人久久奇米网| 99re6这里只有精品| 国产综合色在线| 亚洲国产精品国自产拍av秋霞 | 亚洲综合首页| 99亚洲一区二区| 久久精品123| 亚洲私拍自拍| 久久免费视频网站| 午夜电影亚洲| 欧美1区视频| 久久激情综合网| 欧美亚洲第一区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久狠狠亚洲综合| 欧美日韩国产a| 免费日韩一区二区| 国产欧美一区二区三区久久人妖| 91久久黄色| 午夜精品视频一区| 国产精品永久入口久久久| 亚洲经典三级| 极品尤物久久久av免费看| 亚洲视频一二区| 一本大道久久a久久综合婷婷| 亚洲午夜av在线| 亚洲一区二区三区精品在线| 欧美国产第一页| 欧美福利专区| 亚洲春色另类小说| 欧美影院久久久| 久久网站热最新地址| 依依成人综合视频| 女人天堂亚洲aⅴ在线观看| 最新中文字幕一区二区三区| 日韩亚洲综合在线| 欧美日韩直播| 亚洲欧美在线一区二区| 久久人91精品久久久久久不卡| 欧美激情区在线播放| 欧美在线免费观看视频| 国产日产高清欧美一区二区三区| 久久久久久久久岛国免费| 一区二区视频免费在线观看 | 午夜激情久久久| 久久五月激情| 最近看过的日韩成人| 欧美日韩免费观看一区三区| 亚洲欧美日韩电影| 欧美成人国产va精品日本一级| 亚洲品质自拍| 国产麻豆日韩欧美久久| 麻豆91精品| 亚洲欧美另类在线观看| 免费观看成人www动漫视频| 日韩午夜免费| 国产一级一区二区| 欧美不卡一卡二卡免费版| 一区二区激情视频| 久久久夜精品| 国产精品99久久久久久久vr| 国内成人精品2018免费看| 欧美日韩国产精品一区二区亚洲 | 亚洲福利在线视频| 国产精品日韩久久久| 免费一级欧美片在线观看| 亚洲无限av看| 亚洲风情亚aⅴ在线发布| 亚洲中字黄色| 亚洲国产日韩欧美综合久久| 国产精品高精视频免费| 久久这里只有精品视频首页| 亚洲午夜未删减在线观看| 欧美成年人视频网站| 欧美一区深夜视频| 夜夜精品视频一区二区| 一区福利视频| 国产欧美不卡| 欧美日韩一区高清| 美脚丝袜一区二区三区在线观看 | 亚洲国产网站| 黄色成人片子| 国产精品综合色区在线观看| 欧美jizz19hd性欧美| 久久国产精品久久精品国产 | 黑人巨大精品欧美一区二区| 欧美日韩一区免费| 欧美岛国在线观看| 久久免费高清视频| 小嫩嫩精品导航| 国产精品99久久久久久宅男| 亚洲人被黑人高潮完整版| 亚洲国产欧美日韩另类综合| 女同一区二区| 久久亚洲欧洲| 久久久久高清| 久久福利精品| 久久成人免费网| 久久国产精品黑丝| 久久大香伊蕉在人线观看热2| 久久精品视频一| 久久久久久久国产| 久久精品在线免费观看| 久久精彩视频| 欧美96在线丨欧| 久久野战av| 久久蜜桃精品| 久久久久久久综合| 久久久五月婷婷| 免费久久99精品国产自| 奶水喷射视频一区| 欧美电影免费观看| 欧美日韩日本国产亚洲在线| 欧美黄色影院| 欧美色图天堂网| 国产精品青草久久久久福利99| 国产伦精品一区二区三区视频孕妇 | 亚洲国产婷婷香蕉久久久久久99 | 一区二区三区欧美日韩| 日韩午夜激情|