• <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 夢在天涯 閱讀(908) 評論(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

            搜索

            •  

            積分與排名

            • 積分 - 1804373
            • 排名 - 5

            最新評論

            閱讀排行榜

            国产精品一区二区久久精品涩爱 | 久久综合九色综合久99| 精品久久久久久无码中文字幕一区 | yy6080久久| www.久久精品| 亚洲欧洲精品成人久久奇米网| 精品多毛少妇人妻AV免费久久| 久久精品成人国产午夜| 国产亚洲成人久久| 久久久久久久久波多野高潮| 国产韩国精品一区二区三区久久 | 亚洲国产日韩欧美综合久久| 色狠狠久久AV五月综合| 精品久久久久久无码免费| 少妇高潮惨叫久久久久久 | 久久se精品一区精品二区国产| 久久国产精品无| segui久久国产精品| 亚洲伊人久久大香线蕉综合图片| 久久国产精品久久久| 久久综合综合久久综合| 亚洲а∨天堂久久精品| 丁香狠狠色婷婷久久综合| 日韩人妻无码精品久久久不卡| 久久精品国产99久久香蕉| 乱亲女H秽乱长久久久| 久久人人爽人人爽人人片AV东京热 | 久久精品亚洲乱码伦伦中文| 久久本道伊人久久| 久久国产精品77777| 午夜久久久久久禁播电影| 精品久久亚洲中文无码| 看全色黄大色大片免费久久久| 四虎国产精品免费久久久| 久久99精品久久久久久| 欧美久久综合性欧美| 2022年国产精品久久久久| 国内精品久久久久久野外| 99久久成人国产精品免费| 国产精品久久永久免费| 99精品国产在热久久|