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

隨筆-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可理解為字符串結(jié)構(gòu),其中的start成員變量表示輸入串當(dāng)前分析到的指針.

我們首先需要一個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,這個對象分析輸入串和多個待匹配的連接串是否匹配,這里我們簡單設(shè)為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,這個對象分析輸入串和多個待匹配串中的一個是否匹配,這里我們也簡單的設(shè)為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 }

結(jié)果為:
1 Seq is:2
2 Alt is:1
3 Any is:2

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

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

這個才是我用C++寫的組合字。你看的那個是我用我大二的時候設(shè)計的一門動態(tài)語言寫的。  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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色综合久久久综合网| 欧美精品播放| 欧美一区视频| 国产精品二区二区三区| 日韩亚洲欧美中文三级| 91久久综合| 亚洲视频你懂的| 亚洲一区二区三区影院| 欧美三日本三级三级在线播放| 久久精品人人做人人爽| 国产精品免费看片| 亚洲综合视频1区| 亚洲久色影视| 欧美激情亚洲另类| 亚洲日韩成人| 永久久久久久| 久久综合激情| 欧美黄污视频| 国产视频一区免费看| 欧美一级网站| 久久久水蜜桃av免费网站| 国产亚洲在线观看| 久久精选视频| 亚洲黄色在线| 日韩亚洲国产精品| 欧美日韩国产综合一区二区| 一本久久综合| 久久视频精品在线| 黄色小说综合网站| 欧美二区在线看| 日韩亚洲精品视频| 久久大综合网| 亚洲啪啪91| 国产精品免费福利| 久久精品在线视频| 亚洲日韩欧美一区二区在线| 亚洲国产小视频| 国产精品白丝av嫩草影院| 午夜欧美大片免费观看| 男女av一区三区二区色多| 午夜精品福利在线观看| 在线视频国内自拍亚洲视频| 欧美国产免费| 性色av一区二区三区| 久久久久久久久久久久久女国产乱 | 亚洲神马久久| 欧美不卡一卡二卡免费版| 国产一区二区三区的电影| 久久综合久久综合九色| 一区二区三区高清在线| 欧美福利电影网| 欧美在线短视频| 日韩午夜激情| 黑人操亚洲美女惩罚| 欧美午夜女人视频在线| 欧美成人免费视频| 久久精品成人一区二区三区| 亚洲免费观看在线视频| 欧美黑人在线观看| 欧美专区18| 性18欧美另类| 亚洲欧美日韩区| 亚洲精选一区二区| 在线观看成人网| 国产精品一区久久| 麻豆视频一区二区| 美国十次了思思久久精品导航| 久久久99精品免费观看不卡| 久久亚洲一区二区| 亚洲国产高清高潮精品美女| 欧美激情精品久久久久久变态| 亚洲大片精品永久免费| 一本久道综合久久精品| 欧美一区二区私人影院日本 | 久久―日本道色综合久久| 久久乐国产精品| 欧美久久久久久久久| 国产乱码精品1区2区3区| 伊人夜夜躁av伊人久久| 日韩亚洲不卡在线| 欧美一级免费视频| 欧美大片免费观看| 一区二区av在线| 欧美在线看片a免费观看| 欧美成人精品福利| 麻豆精品精华液| 性欧美激情精品| 久久蜜桃资源一区二区老牛| 亚洲国产成人久久综合一区| 一区二区三区国产精华| 久久综合九色综合欧美就去吻 | 最新国产精品拍自在线播放| 午夜精品久久久久久久99热浪潮 | 亚洲欧美日韩精品久久奇米色影视 | 欧美制服丝袜| 亚洲久久一区二区| 亚洲图中文字幕| 美女脱光内衣内裤视频久久影院| 欧美午夜在线视频| 1024精品一区二区三区| 亚洲欧美国产日韩天堂区| 欧美不卡在线视频| 亚洲欧美国产高清| 欧美日本韩国一区| 在线观看亚洲| 久久久久九九视频| 亚洲一区欧美一区| 欧美日韩在线精品一区二区三区| 亚洲国产精品福利| 免费成年人欧美视频| 欧美一区二区精品| 国产精品一区二区久久精品| 亚洲色图综合久久| 亚洲狠狠婷婷| 欧美黄色aaaa| 亚洲国产女人aaa毛片在线| 久久综合狠狠| 久久国产精品毛片| 国产亚洲综合精品| 久久精品免视看| 欧美一级播放| 国产欧美一区二区三区在线看蜜臀| 一区二区三区黄色| 亚洲精品小视频| 欧美片在线播放| 99视频精品全部免费在线| 欧美国产专区| 嫩草国产精品入口| 韩国一区二区三区美女美女秀| 午夜视黄欧洲亚洲| 在线视频精品| 国产精品久久福利| 午夜在线视频观看日韩17c| 一区二区三欧美| 亚洲欧美国产77777| 在线精品一区二区| 久久乐国产精品| 最新国产乱人伦偷精品免费网站| 国产偷国产偷亚洲高清97cao| 亚洲欧美国产另类| 久久亚洲私人国产精品va媚药| 91久久黄色| 免费日韩视频| 在线亚洲一区| 欧美激情视频网站| 亚洲小说欧美另类婷婷| 国产人妖伪娘一区91| 米奇777在线欧美播放| 在线中文字幕一区| 久久综合激情| 久久av一区二区三区漫画| 亚洲国产小视频| 一区视频在线播放| 国产精品视频福利| 欧美精品在线免费观看| 久久精品视频在线播放| 夜夜嗨一区二区三区| 欧美人成网站| 欧美精品在线视频| 免费成人黄色av| 久久资源av| 蜜桃av一区二区| 欧美日韩精品一区视频| 欧美高清视频一区| 欧美日韩国产综合视频在线| 欧美好吊妞视频| 欧美日一区二区三区在线观看国产免| 美女诱惑黄网站一区| 欧美欧美在线| 国产欧美一区二区三区久久 | 欧美高清视频在线观看| 久久精品成人一区二区三区 | 国产精品视频成人| 国内久久视频| 亚洲第一综合天堂另类专| 最新国产乱人伦偷精品免费网站| 亚洲黄色三级| 欧美一区二区三区四区在线| 久久久久高清| 日韩午夜激情av| 久久一区激情| 国产日韩欧美在线看| 在线视频一区二区| 美女免费视频一区| 亚洲图片在线| 免费影视亚洲| 精品粉嫩aⅴ一区二区三区四区| 亚洲精品欧美一区二区三区| 久久国产直播| avtt综合网| 欧美日韩亚洲一区三区| 精品999在线观看| 欧美在线免费视频| 中文日韩欧美| 国产精品久久久久久久午夜片| 亚洲丰满少妇videoshd| 久久久久久久波多野高潮日日| 亚洲私人影院在线观看| 欧美日韩一区在线观看视频|