• <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++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            模式設計c#--行為型--interpreter

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

            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 夢在天涯 閱讀(912) 評論(0)  編輯 收藏 引用 所屬分類: Design pattern

            公告

            EMail:itech001#126.com

            導航

            統計

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

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807503
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久精品国产亚洲AV电影| 久久综合伊人77777| 久久久久夜夜夜精品国产| 久久国产亚洲精品| 久久综合伊人77777| 色成年激情久久综合| 久久久久亚洲av无码专区导航| 久久久久久国产精品美女| 2020国产成人久久精品| 国产亚洲欧美成人久久片| 99久久综合国产精品二区| 欧美一级久久久久久久大片| 久久夜色精品国产噜噜噜亚洲AV | 伊人色综合久久天天人手人婷 | 久久精品国产亚洲一区二区三区| 热久久视久久精品18| 亚洲国产成人久久一区WWW| 国产综合久久久久| 久久人妻少妇嫩草AV无码蜜桃| 国内精品久久久久久久久电影网| 亚洲欧美日韩久久精品第一区| 国产成人久久久精品二区三区| 国产激情久久久久影院老熟女| 久久中文字幕无码专区| 亚洲AV无一区二区三区久久 | 久久九九精品99国产精品| 国产成人精品久久免费动漫| 亚洲日本va午夜中文字幕久久 | 精品久久久噜噜噜久久久| 秋霞久久国产精品电影院| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久久婷婷五月亚洲97号色| 久久精品国产精品亚洲精品| 久久亚洲电影| 久久精品毛片免费观看| 久久亚洲天堂| 青青草原综合久久| 久久婷婷激情综合色综合俺也去| 精品无码久久久久久久动漫| 日本强好片久久久久久AAA| 久久综合五月丁香久久激情|