亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于C#的表達(dá)式解析器設(shè)計(jì)方法

        2010-08-15 00:45:05
        長春教育學(xué)院學(xué)報 2010年6期
        關(guān)鍵詞:解析器運(yùn)算符表示法

        肖 巍

        (長春師范學(xué)院 傳媒科學(xué)學(xué)院,吉林 長春130032)

        基于C#的表達(dá)式解析器設(shè)計(jì)方法

        肖 巍

        (長春師范學(xué)院 傳媒科學(xué)學(xué)院,吉林 長春130032)

        在MIS系統(tǒng)開發(fā)和報表系統(tǒng)的設(shè)計(jì)中,經(jīng)常會用到通用的表達(dá)式解析器。為此,本文給出了一種采用后綴表達(dá)式實(shí)現(xiàn)的表達(dá)式解析和計(jì)算方法,并用C#語言給予實(shí)現(xiàn)。

        后綴表達(dá)式;表達(dá)式解析;C#

        開發(fā)MIS系統(tǒng)時,報表設(shè)計(jì)中經(jīng)常會碰到表達(dá)式解析器,完成用戶自定義的公式運(yùn)算,使得報表系統(tǒng)顯示的數(shù)據(jù)更加完善和靈活,因此開發(fā)一個相對獨(dú)立的表達(dá)式解析器組件顯得尤為重要。

        一、表達(dá)式表示法

        表達(dá)式中最常見的表示法形式有中綴、前綴和后綴表示法。中綴表示法是書寫表達(dá)式的常見方式,而前綴和后綴表示法主要用于計(jì)算機(jī)科學(xué)領(lǐng)域。

        中綴表示法是表達(dá)式的常規(guī)表示法,稱它為中綴表示法,是因?yàn)槊總€操作符都位于其操作數(shù)的中間,這種表示法只適用于操作符恰好對應(yīng)兩個操作數(shù)時(在操作符是二元操作符,如加、減、乘、除以及取模的情況下)。對以中綴表示法書寫的表達(dá)式進(jìn)行語法分析時,需要用括號和優(yōu)先規(guī)則排除多義性。

        Syntax:operand1 operator operand2Example:(A+B)*C-D/(E+F)

        前綴表示法中,操作符寫在操作數(shù)的前面。這種表示法經(jīng)常用于計(jì)算機(jī)科學(xué)特別是編譯器設(shè)計(jì)方面,為紀(jì)念其發(fā)明者波蘭科學(xué)家Jan Lukasiewicz,這種表示法也稱為“波蘭表示法”。

        Syntax:operator operand1 operand2 Example:-*+ABC/D+EF

        后綴表示法中,操作符位于操作數(shù)后面,后綴表示法也稱為“逆波蘭表示法”(RPN)。

        Syntax : operand1 operand2 operator Example :AB+C*DEF+/-

        中綴表達(dá)式的計(jì)算比較復(fù)雜,它必須遵守以下三條規(guī)則:(1) 先計(jì)算括號內(nèi),后計(jì)算括號外;(2) 在無括號或同層括號內(nèi),先進(jìn)行乘除運(yùn)算,后進(jìn)行加減運(yùn)算,即乘除運(yùn)算的優(yōu)先級高于加減運(yùn)算的優(yōu)先級;(3)同一優(yōu)先級運(yùn)算,從左向右依次進(jìn)行。從這三條規(guī)則中可以看出,在中綴表達(dá)式的計(jì)算過程中,既要考慮括號的作用,又要考慮運(yùn)算符的優(yōu)先級,還要考慮運(yùn)算符出現(xiàn)的先后次序。因此,各運(yùn)算符實(shí)際的運(yùn)算次序往往同它們在表達(dá)式中出現(xiàn)的先后次序是不一致的,是不可預(yù)測的。當(dāng)然,憑直觀判別一個中綴表達(dá)式中哪個運(yùn)算符最先算,哪個次之……,哪個最后算并不困難,但通過計(jì)算機(jī)處理就比較困難了。因?yàn)橛?jì)算機(jī)只能一個字符一個字符地掃描,要想得到哪一個運(yùn)算符先算,就必須對整個中綴表達(dá)式掃描一遍,一個中綴表達(dá)式中有多少個運(yùn)算符,原則上就得掃描多少遍才能計(jì)算完畢,這樣十分浪費(fèi)時間,顯然是不可取的。

        前綴和后綴表示法主要有三條特征:(1)操作數(shù)的順序與等價的中綴表達(dá)式中操作數(shù)的順序一致;(2) 不需要括號;(3)操作符的優(yōu)先級不相關(guān)。在后綴表達(dá)式中,因?yàn)槠洳淮嬖诶ㄌ?,也不存在?yōu)先級的差別,計(jì)算過程完全按照運(yùn)算符出現(xiàn)的先后次序進(jìn)行,整個計(jì)算過程僅需要一遍掃描即可完成,顯然比中綴表達(dá)式的計(jì)算要簡單得多,因此我們采用后綴表達(dá)式來實(shí)現(xiàn)表達(dá)式解析器的解析和計(jì)算。

        二、從中綴表達(dá)式到后綴表達(dá)式的轉(zhuǎn)換

        要把表達(dá)式從中綴表達(dá)式的形式轉(zhuǎn)換成用后綴表示法表示的等價表達(dá)式,必須了解操作符的優(yōu)先級和結(jié)合性。優(yōu)先級或者說操作符的強(qiáng)度決定求值順序;優(yōu)先級高的操作符比優(yōu)先級低的操作符先求值。如果所有操作符優(yōu)先級一樣,那么求值順序就取決于它們的結(jié)合性。操作符的結(jié)合性定義了相同優(yōu)先級操作符組合的順序(從右至左或從左至右)。

        Left associativity:A+B+C= (A+B) +C

        Right associativity:A^B^C=A^(B^C)

        轉(zhuǎn)換過程包括用下面的算法讀入中綴表達(dá)式的操作數(shù)、操作符和括號:(1)初始化一個空堆棧,將結(jié)果字符串變量置空;(2)從左到右讀入中綴表達(dá)式,每次一個字符;(3)如果字符是操作數(shù),將它添加到結(jié)果字符串;(4)如果字符是個操作符,彈出(pop)操作符,直至遇見開括號(opening parenthesis)、優(yōu)先級較低的操作符或者同一優(yōu)先級的右結(jié)合符號,把這個操作符壓入(push)堆棧;(5)如果字符是個開括號,把它壓入堆棧;(6)如果字符是個閉括號(closing parenthesis),在遇見開括號前,彈出所有操作符,然后把它們添加到結(jié)果字符串;(7)如果到達(dá)輸入字符串的末尾,彈出所有操作符并添加到結(jié)果字符串。

        三、后綴表達(dá)式求值

        對后綴表達(dá)式求值比直接對中綴表達(dá)式求值簡單。在后綴表達(dá)式中不需要括號,而且操作符的優(yōu)先級也不再起作用,可以用如下算法對后綴表達(dá)式求值:(1)初始化一個空堆棧;(2)從左到右讀入后綴表達(dá)式;(3)如果字符是一個操作數(shù),把它壓入堆棧;(4)如果字符是個操作符,彈出兩個操作數(shù),執(zhí)行恰當(dāng)操作,然后把結(jié)果壓入堆棧,如果您不能夠彈出兩個操作數(shù),后綴表達(dá)式的語法就不正確;(5)到后綴表達(dá)式末尾,從堆棧中彈出結(jié)果,若后綴表達(dá)式格式正確,那么堆棧應(yīng)該為空。

        四、解析器組件中的幾個重要類

        1.Formula類:該類包含了表達(dá)式的驗(yàn)證屬性和計(jì)算方法

        Formula(string name) :構(gòu)造方法,應(yīng)用表達(dá)式字符串初始化此類;

        Varible屬性:Ivariable接口屬性,用來設(shè)置表達(dá)式計(jì)算時所需要的自定義變量對象,如不設(shè)置,則采用默認(rèn)的自定義變量對象;

        Valid屬性:Error結(jié)構(gòu)體屬性,獲取表達(dá)式的驗(yàn)證信息Error,no為錯誤編號,location為錯誤位置,info為錯誤信息,表達(dá)式驗(yàn)證正確no為0,location為0,info為空串;

        ExpResult Eva() :計(jì)算表達(dá)式的方法,返回ExpResult類型。

        2.ExpResult類:該類包含了表達(dá)式計(jì)算后返回的結(jié)果,應(yīng)用Formula類的Eva方法實(shí)例化

        IsRight屬性:表達(dá)式是否計(jì)算出結(jié)果;

        ErrorNo屬性:獲取表達(dá)式驗(yàn)證后的錯誤號,正確返回為0;

        ErrorLocation屬性:獲取表達(dá)式驗(yàn)證后的位置,正確返回為0;

        abstract double Eval(ArrayList oprands):此方法根據(jù)oprands進(jìn)行計(jì)算,operands個數(shù)為operator元數(shù)。

        4.Ivariable接口:自定義變量類實(shí)現(xiàn)此接口

        Double GetValue(string str) :此方法返回變量計(jì)算時對應(yīng)的值;

        String GetType(string) :此方法返回變量計(jì)算時的類型。

        五、結(jié) 語

        本文通過對幾種表達(dá)式表示法特點(diǎn)的分析,采用了先把中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,再對后綴表達(dá)式進(jìn)行求值的方法,完成了對表達(dá)式解析器算法的設(shè)計(jì),并采用C#語言給予了實(shí)現(xiàn),最后形成獨(dú)立的表達(dá)式解析器組件完全可以將其擴(kuò)展到現(xiàn)有的一些MIS系統(tǒng)中去。

        [1]汪永好.表達(dá)式解析器在工作流管理系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,(06).

        [2]林勇.一款表達(dá)式解析器在電力統(tǒng)計(jì)系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2002,(08).

        [3]何云東.復(fù)雜表達(dá)式解析和計(jì)算的研究實(shí)現(xiàn)[J].中國科技信息,2009,(04).

        [4]葉曉彤等.基于唯一二叉樹的XML函數(shù)表達(dá)式標(biāo)識轉(zhuǎn)換[J].計(jì)算機(jī)工程,2009,(05).

        [5]AndersHejlsberg.C#編程語言詳解[M].北京:電子工業(yè)出版社,2004.

        [6]李維.面向?qū)ο箝_發(fā)實(shí)踐之路[M].北京:電子工業(yè)出版社,2005.

        [7]Ted feison.VisualC#基于組件的開發(fā)[M].北京:清華大學(xué)出版社,2005.

        [責(zé)任編輯:郭一鶴]

        ErrorInfo屬性:獲取表達(dá)式驗(yàn)證后的錯誤信息,正確返回為空串;

        Result屬性:獲取表達(dá)式計(jì)算結(jié)果,表達(dá)式錯誤為空串。

        3.Operator類:操作符抽象類,所有運(yùn)算操作符的基類

        int GetDimension() :此方法返回operator操作符的元數(shù);

        G642

        :B

        :1671-6531(2010)06-0125-02

        2010—09—19

        肖巍,男,吉林長春人,長春師范學(xué)院傳媒科學(xué)學(xué)院教師,研究方向?yàn)閳D像處理與模式識別、自動識別技術(shù)、嵌入式系統(tǒng)研究。

        猜你喜歡
        解析器運(yùn)算符表示法
        有趣的數(shù)字表示法
        老祖?zhèn)魇诨具\(yùn)算符
        基于多解析器的域名隱私保護(hù)機(jī)制
        基于Wireshark的列控中心以太網(wǎng)通信協(xié)議解析器的研究與實(shí)現(xiàn)
        如何防御DNS陷阱?常用3種DNS欺騙手法
        否定意義的四種特殊表示法
        一種基于無關(guān)DNS的通信隱私保護(hù)技術(shù)研究
        電子世界(2018年14期)2018-04-15 16:14:25
        從一道小題聯(lián)想到的整數(shù)表示法
        考試周刊(2016年88期)2016-11-24 21:47:37
        C++運(yùn)算符重載剖析
        價值工程(2014年17期)2014-04-16 03:29:20
        表達(dá)式求值及符號推導(dǎo)
        亚洲一区二区三区99区| 日韩精品一区二区三区免费视频| 午夜理论片yy6080私人影院| 亚洲一线二线三线写真| 欧美一区二区午夜福利在线yw| 亚洲熟妇av日韩熟妇av| 日本在线一区二区免费| 男人的天堂av高清在线| 中文字幕精品久久久久人妻红杏ⅰ| 亚洲精品无码人妻无码| 国产精品欧美亚洲韩国日本| 熟妇人妻精品一区二区视频| 国产欧美va欧美va香蕉在| 永久免费无码av在线网站| 校花高潮一区日韩| 国产三级精品三级在线专区| 亚洲加勒比久久88色综合| 久久精品久久精品中文字幕| 国产高潮精品一区二区三区av| 国产精品一区二区久久蜜桃| 国产精品无码av无码| 亚洲av无码av吞精久久| 人妻无码中文专区久久AV| 久久亚洲春色中文字幕久久| 玩弄丰满奶水的女邻居| 久草视频国产| 免费人妻精品区一区二区三| 天堂8在线新版官网| 亚洲中文字幕无码mv| 久九九久视频精品网站| 中文字字幕在线中文乱码解| 曰本大码熟中文字幕| 久久99久久久无码国产精品色戒| 偷拍激情视频一区二区| 国产高清在线视频一区二区三区 | 轻点好疼好大好爽视频| 麻豆av传媒蜜桃天美传媒| 亚洲视频在线观看青青草| 我和丰满妇女激情视频| 免费人成无码大片在线观看| 亚洲AV手机专区久久精品|