• <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>
            隨筆-91  評(píng)論-137  文章-0  trackbacks-0
            本文的思路來源于http://www.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)前分析到的指針.

            我們首先需要一個(gè)Fail,這個(gè)對(duì)象表示分析失敗,無論輸入是什么都返回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與待驗(yàn)證串s2是否完全匹配.

            然后我們需要一個(gè)Ch,這個(gè)對(duì)象分析輸入串和待匹配串是否相同.
             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"的長(zhǎng)度3,如果匹配失敗則返回0.

            然后我們需要一個(gè)Seq,這個(gè)對(duì)象分析輸入串和多個(gè)待匹配的連接串是否匹配,這里我們簡(jiǎn)單設(shè)為2個(gè)待匹配串.
             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"的長(zhǎng)度4,如果匹配失敗則返回0.

            然后是Alt,這個(gè)對(duì)象分析輸入串和多個(gè)待匹配串中的一個(gè)是否匹配,這里我們也簡(jiǎn)單的設(shè)為2個(gè)待匹配串.
             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"的長(zhǎng)度2,如果匹配失敗則返回0.

            最后是Any,這個(gè)對(duì)象分析輸入串和一個(gè)待匹配串的循環(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"的長(zhǎng)度2*2,如果匹配失敗則返回0.

            然后我們來測(cè)試一下:
             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

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

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

            這個(gè)才是我用C++寫的組合字。你看的那個(gè)是我用我大二的時(shí)候設(shè)計(jì)的一門動(dòng)態(tài)語言寫的。  回復(fù)  更多評(píng)論
              
            国产精品久久永久免费| 一级女性全黄久久生活片免费| 国产精品久久久久9999| 久久激情亚洲精品无码?V| 久久人做人爽一区二区三区 | 狠狠久久综合| 日韩欧美亚洲综合久久| 国产一级持黄大片99久久| 亚洲精品99久久久久中文字幕| 日韩精品久久无码人妻中文字幕| 国产精品免费看久久久香蕉| 午夜人妻久久久久久久久| 久久久久亚洲爆乳少妇无 | 久久精品亚洲欧美日韩久久| 亚洲成色www久久网站夜月| 国产精品99久久久久久董美香| 中文字幕乱码人妻无码久久| 国内精品欧美久久精品| 国产精品久久久久无码av| 日产精品久久久久久久性色 | 久久久av波多野一区二区| 一级做a爰片久久毛片看看 | 欧美精品丝袜久久久中文字幕| 国产aⅴ激情无码久久| 日韩中文久久| 久久国产成人精品国产成人亚洲| 久久se精品一区精品二区| 色欲综合久久躁天天躁蜜桃| 精品久久久久成人码免费动漫 | 久久天天躁狠狠躁夜夜av浪潮| 国产亚洲精久久久久久无码| 精品久久久无码21p发布 | 久久99精品国产99久久6男男| 午夜天堂精品久久久久| 中文字幕乱码人妻无码久久| 久久精品国产男包| 亚洲国产精品无码久久久蜜芽| 久久91精品国产91| 久久久SS麻豆欧美国产日韩| 怡红院日本一道日本久久 | 久久精品国产一区|