• <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
            本文的思路來(lái)源于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ì)象表示分析失敗,無(wú)論輸入是什么都返回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.

            然后我們來(lái)測(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 閱讀(1636) 評(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)
            的確..沒(méi)有理解組合這個(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)語(yǔ)言寫的。  回復(fù)  更多評(píng)論
              
            99久久国产宗和精品1上映| 91久久国产视频| 久久精品一区二区三区不卡| 91精品国产乱码久久久久久| 久久亚洲国产成人影院网站| 国产亚洲精品久久久久秋霞| 国产精品永久久久久久久久久| 久久99国产精品久久99小说| 久久99精品国产麻豆宅宅| 国产69精品久久久久观看软件| 久久精品国产精品亚洲精品| 中文字幕无码免费久久| 久久精品国产福利国产琪琪| 久久精品无码专区免费青青| 久久综合视频网| 日本道色综合久久影院| 欧美精品乱码99久久蜜桃| 国产精品嫩草影院久久| 亚洲中文字幕久久精品无码喷水| 久久露脸国产精品| 国产精品久久久久一区二区三区| 久久精品天天中文字幕人妻| 日韩人妻无码一区二区三区久久99| 青青国产成人久久91网| 久久精品无码午夜福利理论片| 日韩人妻无码一区二区三区久久99 | 99久久精品免费观看国产| 久久妇女高潮几次MBA| 日韩久久久久久中文人妻 | 热久久国产精品| 久久精品国产亚洲AV麻豆网站 | 国产激情久久久久影院老熟女免费| 亚洲精品乱码久久久久久按摩 | 午夜精品久久久久久中宇| 久久只有这里有精品4| 亚洲国产成人精品无码久久久久久综合| 欧美久久综合性欧美| 国产日韩欧美久久| 国产毛片欧美毛片久久久| 久久精品国产精品亚洲| 久久嫩草影院免费看夜色|