• <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>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計模式} {C#基礎(chǔ)}

            模式設(shè)計c#--行為型--interpreter

            名稱 Interpreter
            結(jié)構(gòu) o_interpreter.bmp
            意圖 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
            適用性
            • 當(dāng)有一個語言需要解釋執(zhí)行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當(dāng)存在以下情況時該模式效果最好:
            • 該文法簡單對于復(fù)雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構(gòu)建抽象語法樹即可解釋表達式, 這樣可以節(jié)省空間而且還可能節(jié)省時間。
            • 效率不是一個關(guān)鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現(xiàn)的, 而是首先將它們轉(zhuǎn)換成另一種形式。例如,正則表達式通常被轉(zhuǎn)換成狀態(tài)機。但即使在這種情況下, 轉(zhuǎn)換器仍可用解釋器模式實現(xiàn), 該模式仍是有用的。

            Code Example
            namespace?Interpreter_DesignPattern
            {
            ????
            using?System;
            ????
            using?System.Collections;

            ????
            class?Context?
            ????
            {
            ????????
            ????}


            ????
            abstract?class?AbstractExpression?
            ????
            {
            ????????
            abstract?public?void?Interpret(Context?c);
            ????}


            ????
            //?class?for?terminal?symbol
            ????class?TerminalExpression?:?AbstractExpression
            ????
            {
            ????????
            override?public?void?Interpret(Context?c)????
            ????????
            {
            ????????????
            ????????}

            ????}


            ????
            //?class?for?grammar?rule?(one?per?rule?needed)
            ????class?NonterminalExpression?:?AbstractExpression
            ????
            {
            ????????
            override?public?void?Interpret(Context?c)????
            ????????
            {
            ????????????
            ????????}
            ????
            ????}

            ????
            //?to?extend?grammar,?just?add?other?NonterminalExpression?classes

            ????
            ///?<summary>
            ????
            ///????Summary?description?for?Client.
            ????
            ///?</summary>

            ????public?class?Client
            ????
            {
            ????????
            public?static?int?Main(string[]?args)
            ????????
            {
            ????????????Context?c?
            =?new?Context();
            ????????????ArrayList?l?
            =?new?ArrayList();?//really?need?a?tree?here!

            ????????????
            //?build?up?context?information?
            ????????????
            //?.?.?.

            ????????????
            //?Populate?abstract?syntax?tree?with?data
            ????????????l.Add(new?TerminalExpression());
            ????????????l.Add(
            new?NonterminalExpression());

            ????????????
            //?interpret
            ????????????foreach?(AbstractExpression?exp?in?l)
            ????????????
            {
            ????????????????exp.Interpret(c);
            ????????????}

            ????????????????????
            ????????????
            return?0;
            ????????}

            ????}

            }


            解析表達式:
            //?Interpreter?pattern?--?Real?World?example??


            using?System;
            using?System.Collections;

            namespace?DoFactory.GangOfFour.Interpreter.RealWorld
            {

            ??
            //?MainApp?test?application?

            ??
            class?MainApp
            ??
            {
            ????
            static?void?Main()
            ????
            {
            ??????
            string?roman?=?"MCMXXVIII";
            ??????Context?context?
            =?new?Context(roman);

            ??????
            //?Build?the?'parse?tree'?
            ??????ArrayList?tree?=?new?ArrayList();
            ??????tree.Add(
            new?ThousandExpression());
            ??????tree.Add(
            new?HundredExpression());
            ??????tree.Add(
            new?TenExpression());
            ??????tree.Add(
            new?OneExpression());

            ??????
            //?Interpret?
            ??????foreach?(Expression?exp?in?tree)
            ??????
            {
            ????????exp.Interpret(context);
            ??????}


            ??????Console.WriteLine(
            "{0}?=?{1}",?
            ????????roman,?context.Output);

            ??????
            //?Wait?for?user?
            ??????Console.Read();
            ????}

            ??}


            ??
            //?"Context"?

            ??
            class?Context
            ??
            {
            ????
            private?string?input;
            ????
            private?int?output;

            ????
            //?Constructor?
            ????public?Context(string?input)
            ????
            {
            ??????
            this.input?=?input;
            ????}


            ????
            //?Properties?
            ????public?string?Input
            ????
            {
            ??????
            get{?return?input;?}
            ??????
            set{?input?=?value;?}
            ????}


            ????
            public?int?Output
            ????
            {
            ??????
            get{?return?output;?}
            ??????
            set{?output?=?value;?}
            ????}

            ??}


            ??
            //?"AbstractExpression"?

            ??
            abstract?class?Expression
            ??
            {
            ????
            public?void?Interpret(Context?context)
            ????
            {
            ??????
            if?(context.Input.Length?==?0)?
            ????????
            return;

            ??????
            if?(context.Input.StartsWith(Nine()))
            ??????
            {
            ????????context.Output?
            +=?(9?*?Multiplier());
            ????????context.Input?
            =?context.Input.Substring(2);
            ??????}

            ??????
            else?if?(context.Input.StartsWith(Four()))
            ??????
            {
            ????????context.Output?
            +=?(4?*?Multiplier());
            ????????context.Input?
            =?context.Input.Substring(2);
            ??????}

            ??????
            else?if?(context.Input.StartsWith(Five()))
            ??????
            {
            ????????context.Output?
            +=?(5?*?Multiplier());
            ????????context.Input?
            =?context.Input.Substring(1);
            ??????}


            ??????
            while?(context.Input.StartsWith(One()))
            ??????
            {
            ????????context.Output?
            +=?(1?*?Multiplier());
            ????????context.Input?
            =?context.Input.Substring(1);
            ??????}

            ????}


            ????
            public?abstract?string?One();
            ????
            public?abstract?string?Four();
            ????
            public?abstract?string?Five();
            ????
            public?abstract?string?Nine();
            ????
            public?abstract?int?Multiplier();
            ??}


            ??
            //?Thousand?checks?for?the?Roman?Numeral?M?
            ??
            //?"TerminalExpression"?

            ??
            class?ThousandExpression?:?Expression
            ??
            {
            ????
            public?override?string?One()?{?return?"M";?}
            ????
            public?override?string?Four(){?return?"?";?}
            ????
            public?override?string?Five(){?return?"?";?}
            ????
            public?override?string?Nine(){?return?"?";?}
            ????
            public?override?int?Multiplier()?{?return?1000;?}
            ??}


            ??
            //?Hundred?checks?C,?CD,?D?or?CM?
            ??
            //?"TerminalExpression"?

            ??
            class?HundredExpression?:?Expression
            ??
            {
            ????
            public?override?string?One()?{?return?"C";?}
            ????
            public?override?string?Four(){?return?"CD";?}
            ????
            public?override?string?Five(){?return?"D";?}
            ????
            public?override?string?Nine(){?return?"CM";?}
            ????
            public?override?int?Multiplier()?{?return?100;?}
            ??}


            ??
            //?Ten?checks?for?X,?XL,?L?and?XC?
            ??
            //?"TerminalExpression"?

            ??
            class?TenExpression?:?Expression
            ??
            {
            ????
            public?override?string?One()?{?return?"X";?}
            ????
            public?override?string?Four(){?return?"XL";?}
            ????
            public?override?string?Five(){?return?"L";?}
            ????
            public?override?string?Nine(){?return?"XC";?}
            ????
            public?override?int?Multiplier()?{?return?10;?}
            ??}


            ??
            //?One?checks?for?I,?II,?III,?IV,?V,?VI,?VI,?VII,?VIII,?IX?
            ??
            //?"TerminalExpression"?

            ??
            class?OneExpression?:?Expression
            ??
            {
            ????
            public?override?string?One()?{?return?"I";?}
            ????
            public?override?string?Four(){?return?"IV";?}
            ????
            public?override?string?Five(){?return?"V";?}
            ????
            public?override?string?Nine(){?return?"IX";?}
            ????
            public?override?int?Multiplier()?{?return?1;?}
            ??}

            }

            ?
            Output
            MCMXXVIII = 1928

            posted on 2006-01-03 16:02 夢在天涯 閱讀(907) 評論(0)  編輯 收藏 引用 所屬分類: Design pattern

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804159
            • 排名 - 5

            最新評論

            閱讀排行榜

            97久久超碰成人精品网站| 久久久久亚洲AV成人网人人网站| 国产69精品久久久久9999APGF | 国产精品一区二区久久精品| 久久久久久免费一区二区三区 | 伊人久久大香线蕉综合热线| 亚洲国产精品无码久久98| 88久久精品无码一区二区毛片| 亚洲日本va午夜中文字幕久久| 国产综合久久久久久鬼色| 日韩亚洲国产综合久久久| 久久精品国产99国产精偷 | 国内精品久久久久久久涩爱| 久久婷婷人人澡人人爽人人爱 | 精品国产99久久久久久麻豆| 91精品国产综合久久四虎久久无码一级| 欧美亚洲另类久久综合婷婷 | 91精品国产91久久| 欧美牲交A欧牲交aⅴ久久| 欧美一级久久久久久久大| 99久久伊人精品综合观看| 久久亚洲日韩精品一区二区三区 | 亚洲精品乱码久久久久久久久久久久 | 四虎国产精品成人免费久久| 国产亚洲精久久久久久无码AV| 久久一日本道色综合久久| 少妇熟女久久综合网色欲| 伊人久久亚洲综合影院| 久久夜色撩人精品国产小说| 国产成人精品久久| 青青青青久久精品国产| 国产午夜久久影院| 91久久精品91久久性色| 77777亚洲午夜久久多喷| 久久精品人成免费| 99久久er这里只有精品18| 久久久无码人妻精品无码| 久久久精品国产sm调教网站| 久久婷婷成人综合色综合| 久久精品欧美日韩精品| 国内精品久久久久影院一蜜桃|