• <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>
            Lyt
            posts - 16,comments - 61,trackbacks - 0

             

            今天使用智能指針LytPtr初步完成了表達式樹,未調試完全,頭文件代碼如下:

             1class Interpret
             2{
             3public:
             4  Error ErrorInfomation;
             5
             6  bool IsError();
             7  LytPtr<Program> Run(const LytWString Content);
             8
             9private:
            10  LytPtr<Program> GetProgram(Node<Token*>*& Current);
            11  LytPtr<Function> GetFunction(Node<Token*>*& Current);
            12  LytPtr<Var> GetVar(Node<Token*>*& Current);
            13  LytPtr<Block> GetBlock(Node<Token*>*& Current);
            14  LytPtr<FunHead> GetFunHead(Node<Token*>*& Current);
            15  LytPtr<FunHead> GetFunctionHead(Node<Token*>*& Current);
            16  LytPtr<FunHead> GetProcedureHead(Node<Token*>*& Current);
            17  LytPtr<Statement> GetStatement(Node<Token*>*& Current);
            18  LytPtr<Statement> GetAssignStatementOrSimpleStatement(Node<Token*>*& Current);
            19  LytPtr<Statement> GetIfStatement(Node<Token*>*& Current);
            20  LytPtr<Statement> GetWhileDoStatement(Node<Token*>*& Current);
            21  LytPtr<Statement> GetDoWhileStatement(Node<Token*>*& Current);
            22  LytPtr<Statement> GetControlStatement(Node<Token*>*& Current);
            23  LytPtr<Statement> GetReturnStatement(Node<Token*>*& Current);
            24  LytPtr<Statement> GetCompoundStatement(Node<Token*>*& Current);
            25  LytPtr<Expression> GetExpression(Node<Token*>*& Current);
            26  LytPtr<Expression> GetRelationExpression(Node<Token*>*& Current);
            27  LytPtr<Expression> GetXorExpression(Node<Token*>*& Current);
            28  LytPtr<Expression> GetOrExpression(Node<Token*>*& Current);
            29  LytPtr<Expression> GetAddSubExpression(Node<Token*>*& Current);
            30  LytPtr<Expression> GetAndExpression(Node<Token*>*& Current);
            31  LytPtr<Expression> GetMulDivExpression(Node<Token*>*& Current);
            32  LytPtr<Expression> GetPositiveNegativeExpression(Node<Token*>*& Current);
            33  LytPtr<Expression> GetNotExpression(Node<Token*>*& Current);
            34  LytPtr<Expression> GetSimpleExpression(Node<Token*>*& Current);
            35  LytPtr<Expression> GetCallFunctionExpression(Node<Token*>*& Current);
            36}
            ;

            其中,關于優先級的設計有點迷惑,參考了網上關于Pascal操作符優先級后,文法如下:

            Expression = RelationExpression;
            RelationExpression = RelationExpression ("<" | "<=" | "=" | "!=" | ">" | ">=") XorExpression | XorExpression
            XorExpression = XorExpression "xor" OrExpression | OrExpression
            OrExpression = OrExpression "or" AddExpression | AddSubExpression
            AddSubExpression = AddSubExpression ("+" | "-") AndExpression | AndExpression
            AndExpression = AndExpression "and" MulDivExpression | MulDivModExpression
            MulDivModExpression = MulDivModExpression ("*" | "div" | "mod") UnaryExpression | UnaryExpression
            PositiveNegativeExpression = ("+" | "-") NotExpression | NotExpression
            NotExpression = "not" SimpleExpression | SimpleExpression;
            SimpleExpression = Number | bool | CallFunctionExpression

            代碼舉例:

             1LytPtr<Expression> GetAddSubExpression(Node<Token*>*& Current)
             2{
             3    if (!Current) return 0;
             4    else
             5    {
             6        LytPtr<Expression> Result=GetAndExpression(Current);
             7        if (IsError()) return 0;
             8        else
             9        {
            10            while (Current && (Current->Data->Content==L"+" || Current->Data->Content==L"-"))
            11            {
            12                LytPtr<Expression> Left=Result;
            13                Result=new BinaryExpression;
            14                BinaryExpression* Temp=(BinaryExpression*)Result.Buffer();
            15                Temp->Left=Left;
            16                Temp->Operator=*(Current->Data);
            17                Current=Current->Next;
            18                if (!Current)
            19                {
            20                    ErrorInfomation.SetMessage(L"加減表達式缺少右操作數 =>"+ErrorInfomation.GetMessage());
            21                    return 0;
            22                }

            23                LytPtr<Expression> Right=GetAndExpression(Current);
            24                if (IsError())
            25                {
            26                    ErrorInfomation.SetMessage(L"加減表達式右操作數出錯 =>"+ErrorInfomation.GetMessage());
            27                    return 0;
            28                }

            29                else Temp->Right=Right;
            30            }

            31            return Result;
            32        }

            33    }

            34}

            35
            36LytPtr<Expression> GetMulDivExpression(Node<Token*>*& Current)
            37{
            38    if (!Current) return 0;
            39    else
            40    {
            41        LytPtr<Expression> Result=GetPositiveNegativeExpression(Current);
            42        if (IsError()) return 0;
            43        else
            44        {
            45            while (Current && (Current->Data->Content==L"*" || Current->Data->Content==L"div"))
            46            {
            47                LytPtr<Expression> Left=Result;
            48                Result=new BinaryExpression;
            49                BinaryExpression* Temp=(BinaryExpression*)Result.Buffer();
            50                Temp->Left=Left;
            51                Temp->Operator=*(Current->Data);
            52                Current=Current->Next;
            53                if (!Current)
            54                {
            55                    ErrorInfomation.SetMessage(L"*/div表達式缺少右操作數 =>"+ErrorInfomation.GetMessage());
            56                    return 0;
            57                }

            58                LytPtr<Expression> Right=GetPositiveNegativeExpression(Current);
            59                if (IsError())
            60                {
            61                    ErrorInfomation.SetMessage(L"*/div表達式右操作數出錯 =>"+ErrorInfomation.GetMessage());
            62                    return 0;
            63                }

            64                else Temp->Right=Right;
            65            }

            66            return Result;
            67        }

            68    }

            69}

             

            不難發現,含有二元操作符的表達式文法接近(一元也一樣),函數實現方法也類似,為了讓代碼好看點,我動了幾個念頭,但最終沒實現:

            1.函數模板

            2.函數指針:利用typedef,后來發現定義過程中有遞歸,遂寫不出來,暫時放棄

            3.宏:記得括號來括號去那里要加得很清楚,腦袋暈乎,暫時放棄

            晚上睡覺能想到啥好辦法明天再解決。

             

            在構造表達式樹的時候還出現了幾個問題:

            1.先前由于我沒有充分測試,LytPtr有bug,自食其果了

            結論:寫出啥數據結構在使用前一定要充分測試

            2.猶豫到底該用返回什么類型的指針,暫時還不明白返回LytPtr<Expression>與返回LytPtr<Base>的區別,其中Expression是繼承Base的

            3.LytPtr不支持類型轉換,于是在需要類型轉換的時候愣了幾下,忘記可以轉成指針來用了

            結論:該用指針的時候還是用指針

             

            希望明天完成測試表達式樹與類型檢查。

            posted on 2009-03-22 00:55 Lyt 閱讀(573) 評論(1)  編輯 收藏 引用 所屬分類: Pascal簡化版

            FeedBack:
            # re: 初步完成表達式樹
            2009-03-22 01:29 | 陳梓瀚(vczh)
            4:將操作符的優先級放在一個數組里面,然后設計一個通用算法解決。  回復  更多評論
              
            国产精品免费久久久久久久久 | 日本久久中文字幕| 久久久精品日本一区二区三区| 久久久精品久久久久特色影视| 亚洲狠狠婷婷综合久久蜜芽| 99久久无码一区人妻a黑| 欧美粉嫩小泬久久久久久久| 无码久久精品国产亚洲Av影片| 日本三级久久网| 色综合久久无码五十路人妻 | www亚洲欲色成人久久精品| 香蕉久久久久久狠狠色| 久久99国产精品久久| 久久久www免费人成精品| 久久精品国产72国产精福利| 久久综合给合久久狠狠狠97色| 亚洲成av人片不卡无码久久| 欧美精品一本久久男人的天堂 | 国产成人精品久久亚洲| 久久精品人人做人人爽97| 一本大道久久东京热无码AV| 国产L精品国产亚洲区久久| 久久久91精品国产一区二区三区| 无码超乳爆乳中文字幕久久| 亚洲欧美另类日本久久国产真实乱对白| 久久久久四虎国产精品| 精品国产一区二区三区久久久狼| 久久精品国产亚洲AV影院| 久久受www免费人成_看片中文 | 99国产欧美久久久精品蜜芽| 久久中文字幕人妻丝袜| 国产69精品久久久久久人妻精品| 91麻豆国产精品91久久久| 中文字幕无码久久久| 国产精品美女久久福利网站| 尹人香蕉久久99天天拍| 久久久久人妻一区二区三区| 精品久久久久久国产| 69久久夜色精品国产69| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲国产成人久久精品动漫|