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

隨筆-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函數用于分析輸入串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,這個對象分析輸入串和一個待匹配串的循環是否匹配.
 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 閱讀(1662) 評論(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++寫的組合字。你看的那個是我用我大二的時候設計的一門動態語言寫的。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本色道久久综合亚洲精品小说 | 亚洲人被黑人高潮完整版| 亚洲欧美在线x视频| 中文av字幕一区| 亚洲午夜在线观看| 亚洲欧美视频在线| 久久婷婷激情| 亚洲国产精品嫩草影院| 日韩性生活视频| 午夜视频一区二区| 蜜桃伊人久久| 国产精品成人在线| 国产视频久久| 亚洲精品老司机| 午夜精品www| 欧美成人综合在线| 一本一本久久a久久精品综合妖精| 亚洲一区中文| 美女视频黄 久久| 国产精品美女| 亚洲激情偷拍| 性欧美xxxx大乳国产app| 免费不卡在线观看av| 亚洲老司机av| 久久精品夜色噜噜亚洲a∨| 欧美成人免费全部| 国产亚洲欧美日韩精品| 亚洲精品一区二区在线观看| 性视频1819p久久| 欧美1级日本1级| 亚洲男人第一网站| 欧美激情四色| 亚洲第一网站免费视频| 亚洲一区亚洲| 亚洲激情成人| 久久亚洲视频| 国产日韩久久| 亚洲一区二区免费看| 亚洲大胆美女视频| 久久国产直播| 国产精品美女一区二区| 日韩亚洲精品视频| 欧美成人免费va影院高清| 亚洲免费一区二区| 欧美精品性视频| 先锋亚洲精品| 性刺激综合网| 亚洲精品在线免费| 久久一区二区三区av| 国产精品国产一区二区| 亚洲精品久久久久久久久久久久久| 久久精品免费观看| 亚洲调教视频在线观看| 欧美精品三级在线观看| 亚洲欧洲精品一区二区三区 | 国产精品国产三级国产a| 亚洲精品乱码久久久久久久久 | 亚洲日本aⅴ片在线观看香蕉| 久久国产精品网站| 午夜精品久久久久久久久| 国产精品国产三级国产普通话99 | 亚洲精品日韩在线| 亚洲国产精品久久人人爱蜜臀| 久久综合伊人77777蜜臀| 一区精品久久| 欧美成人午夜激情| 免费成人激情视频| 亚洲精选一区二区| av不卡在线观看| 国产精品久久9| 欧美亚洲免费高清在线观看| 亚洲自拍偷拍网址| 狠狠色狠狠色综合人人| 蜜臀av性久久久久蜜臀aⅴ| 免费在线日韩av| 一区二区欧美日韩| 亚洲专区一区二区三区| 狠狠88综合久久久久综合网| 美日韩在线观看| 欧美伦理在线观看| 欧美一区二区三区日韩视频| 久久国产精品72免费观看| 在线成人av网站| 亚洲精品在线三区| 国产伦精品免费视频| 老司机午夜精品| 欧美日韩国产色综合一二三四| 午夜宅男久久久| 久久五月婷婷丁香社区| 一区二区三区 在线观看视| 亚洲一区日韩在线| 亚洲黄色精品| 亚洲中字黄色| 日韩一级在线观看| 久久不见久久见免费视频1| 亚洲精品少妇网址| 新狼窝色av性久久久久久| 亚洲国产精品一区在线观看不卡| 亚洲美女在线看| 一区免费观看视频| 亚洲午夜免费视频| 久久久亚洲高清| 国内精品视频666| 亚洲国产另类久久精品| 国产精品高潮久久| 欧美激情影院| 国产一区自拍视频| 中日韩美女免费视频网址在线观看| 国产亚洲精品久久久久久| 亚洲精品影视| 亚洲福利国产精品| 性欧美video另类hd性玩具| 一本久道久久综合狠狠爱| 欧美在线视频一区二区三区| 亚洲图片欧洲图片av| 免费人成网站在线观看欧美高清| 欧美中文字幕| 国产精品网站在线| 99av国产精品欲麻豆| 亚洲日本激情| 久久伊人精品天天| 久久国产精品久久精品国产| 欧美日本一区| 最新国产精品拍自在线播放| 狠狠色综合网站久久久久久久| 亚洲性夜色噜噜噜7777| 99视频国产精品免费观看| 美国十次了思思久久精品导航| 久久久夜精品| 国内成人精品一区| 欧美在线日韩精品| 久久男女视频| 狠狠狠色丁香婷婷综合激情| 午夜精品久久久久| 欧美中文日韩| 国产一区二区三区久久精品| 性欧美xxxx视频在线观看| 香蕉成人伊视频在线观看| 国产精品成人一区二区三区吃奶 | 亚洲精品久久久久久久久久久久久| 国产综合久久久久久| 欧美综合77777色婷婷| 久久久综合网| 亚洲国产精品va| 欧美激情aⅴ一区二区三区| 亚洲国产精品一区二区三区| 最新日韩av| 欧美精品亚洲精品| 一本久久精品一区二区| 亚洲一区二区在线| 国产乱码精品一区二区三| 欧美一区二区高清| 免费永久网站黄欧美| 亚洲经典三级| 欧美日韩一区在线视频| 亚洲视频自拍偷拍| 久久久噜噜噜久久中文字免| 一区二区三区在线看| 欧美福利视频在线观看| 亚洲视频导航| 狂野欧美激情性xxxx欧美| 亚洲精品一区二区三区不| 欧美色大人视频| 欧美在线三级| 亚洲久久在线| 葵司免费一区二区三区四区五区| 亚洲美女在线看| 国产日韩高清一区二区三区在线| 欧美 日韩 国产在线| 亚洲免费大片| 久久国产视频网站| 亚洲精品乱码久久久久久按摩观| 欧美日韩精品在线观看| 欧美影片第一页| 亚洲裸体在线观看| 久久久夜精品| 亚洲综合色婷婷| 亚洲国产欧美国产综合一区| 国产精品高潮呻吟久久av无限| 久久精品国产一区二区三| 亚洲精品视频中文字幕| 久久久久久久激情视频| 一区二区三区色| 亚洲成人资源网| 国产亚洲激情在线| 欧美日韩妖精视频| 欧美1级日本1级| 久久国产婷婷国产香蕉| 在线视频欧美日韩精品| 欧美福利电影网| 久久精品国产欧美亚洲人人爽| 一区二区精品| 亚洲精品日韩激情在线电影 | 亚洲自拍电影| 一区二区电影免费在线观看| 黑人极品videos精品欧美裸| 国产精品不卡在线| 欧美三级欧美一级| 欧美暴力喷水在线| 麻豆国产精品777777在线|