• <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初步完成了表達(dá)式樹(shù),未調(diào)試完全,頭文件代碼如下:

             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}
            ;

            其中,關(guān)于優(yōu)先級(jí)的設(shè)計(jì)有點(diǎn)迷惑,參考了網(wǎng)上關(guān)于Pascal操作符優(yōu)先級(jí)后,文法如下:

            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"加減表達(dá)式缺少右操作數(shù) =>"+ErrorInfomation.GetMessage());
            21                    return 0;
            22                }

            23                LytPtr<Expression> Right=GetAndExpression(Current);
            24                if (IsError())
            25                {
            26                    ErrorInfomation.SetMessage(L"加減表達(dá)式右操作數(shù)出錯(cuò) =>"+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表達(dá)式缺少右操作數(shù) =>"+ErrorInfomation.GetMessage());
            56                    return 0;
            57                }

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

            64                else Temp->Right=Right;
            65            }

            66            return Result;
            67        }

            68    }

            69}

             

            不難發(fā)現(xiàn),含有二元操作符的表達(dá)式文法接近(一元也一樣),函數(shù)實(shí)現(xiàn)方法也類似,為了讓代碼好看點(diǎn),我動(dòng)了幾個(gè)念頭,但最終沒(méi)實(shí)現(xiàn):

            1.函數(shù)模板

            2.函數(shù)指針:利用typedef,后來(lái)發(fā)現(xiàn)定義過(guò)程中有遞歸,遂寫不出來(lái),暫時(shí)放棄

            3.宏:記得括號(hào)來(lái)括號(hào)去那里要加得很清楚,腦袋暈乎,暫時(shí)放棄

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

             

            在構(gòu)造表達(dá)式樹(shù)的時(shí)候還出現(xiàn)了幾個(gè)問(wèn)題:

            1.先前由于我沒(méi)有充分測(cè)試,LytPtr有bug,自食其果了

            結(jié)論:寫出啥數(shù)據(jù)結(jié)構(gòu)在使用前一定要充分測(cè)試

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

            3.LytPtr不支持類型轉(zhuǎn)換,于是在需要類型轉(zhuǎn)換的時(shí)候愣了幾下,忘記可以轉(zhuǎn)成指針來(lái)用了

            結(jié)論:該用指針的時(shí)候還是用指針

             

            希望明天完成測(cè)試表達(dá)式樹(shù)與類型檢查。

            posted on 2009-03-22 00:55 Lyt 閱讀(555) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Pascal簡(jiǎn)化版

            FeedBack:
            # re: 初步完成表達(dá)式樹(shù)
            2009-03-22 01:29 | 陳梓瀚(vczh)
            4:將操作符的優(yōu)先級(jí)放在一個(gè)數(shù)組里面,然后設(shè)計(jì)一個(gè)通用算法解決。  回復(fù)  更多評(píng)論
              
            久久精品免费全国观看国产| 蜜桃麻豆www久久| 久久99精品免费一区二区| 亚洲国产精久久久久久久| 亚洲国产成人久久综合野外| 亚洲国产精品久久电影欧美| 99久久国产综合精品五月天喷水| 久久中文精品无码中文字幕| 亚洲乱码精品久久久久..| 久久青草国产精品一区| 人妻无码精品久久亚瑟影视| 国产激情久久久久影院小草 | 韩国三级大全久久网站| 一本综合久久国产二区| 精品久久久久久国产91| 麻豆精品久久久久久久99蜜桃| 久久免费美女视频| 久久婷婷五月综合97色一本一本 | 色综合久久综精品| 色婷婷综合久久久久中文一区二区 | AV色综合久久天堂AV色综合在| 午夜精品久久久久久| 97精品伊人久久久大香线蕉| 久久国产精品99国产精| 久久综合久久综合亚洲| 色悠久久久久久久综合网| 国产精品免费久久久久电影网| 91久久精品91久久性色| 久久久女人与动物群交毛片| 久久精品青青草原伊人| 无码八A片人妻少妇久久| 午夜视频久久久久一区 | 国产情侣久久久久aⅴ免费| 久久人人爽人人爽人人片AV麻烦| 精品久久久久国产免费| 久久久久噜噜噜亚洲熟女综合| 国产99精品久久| 日本精品久久久久中文字幕8| 精品久久久噜噜噜久久久| 国内精品久久久久影院一蜜桃| 久久丫精品国产亚洲av不卡 |