• <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>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                這個分析器包含了四個文件:
                VL_Data_Basic.h(使用了其中的智能指針VL_AutoPtr和一些類型重命名)
                VL_CpData.h(數(shù)據(jù)結構)
                VL_CpKernel.h/cpp(詞法分析器和語法分析器)

                昨天剛寫好的,可能有Bug,這個東西供給熟悉編譯原理(至少熟悉BNF notation)的人互相學習交流,并不打算作為一個成品出現(xiàn)。以下是將一個四則運算式子的字符串進行詞法分析,分割成記號之后求值的代碼:
              1 #include "..\..\..\..\VL++\Library\Platform\VL_Console.h"
              2 #include "..\..\..\..\VL++\Library\Data\Grammar2\VL_CpKernel.h"
              3 
              4 using namespace vl;
              5 using namespace vl::platform;
              6 using namespace vl::grammar;
              7 
              8 enum Operator
              9 {
             10     opAdd,
             11     opSub,
             12     opMul,
             13     opDiv
             14 };
             15 
             16 enum TokenID
             17 {
             18     tiNumber,
             19     tiLeft,
             20     tiRight,
             21     tiAdd,
             22     tiSub,
             23     tiMul,
             24     tiDiv
             25 };
             26 
             27 VDouble Number(const VL_CpToken& Input)
             28 {
             29     return VUnicodeString(Input.Start,Input.Length).ToDouble();
             30 }
             31 
             32 Operator Op(const VL_CpToken& Input)
             33 {
             34     switch(Input.ID)
             35     {
             36     case tiAdd:return opAdd;
             37     case tiSub:return opSub;
             38     case tiMul:return opMul;
             39     case tiDiv:return opDiv;
             40     default:return (Operator)-1;
             41     }
             42 }
             43 
             44 VDouble RemoveBracket(const VL_CpPair<VL_CpPair<VL_CpToken , VDouble> , VL_CpToken>& Input)
             45 {
             46     return Input.First.Second;
             47 }
             48 
             49 VDouble Calculate(const VL_CpPair<VDouble,VL_CpList<VL_CpPair<Operator,VDouble>>>& Numbers)
             50 {
             51     VDouble Result=Numbers.First;
             52     VL_CpList<VL_CpPair<Operator,VDouble>>::Node::Ptr Current=Numbers.Second.Head;
             53     while(Current)
             54     {
             55         switch(Current->Data.First)
             56         {
             57         case opAdd:
             58             Result+=Current->Data.Second;
             59             break;
             60         case opSub:
             61             Result-=Current->Data.Second;
             62             break;
             63         case opMul:
             64             Result*=Current->Data.Second;
             65             break;
             66         case opDiv:
             67             Result/=Current->Data.Second;
             68             break;
             69         }
             70         Current=Current->Next;
             71     }
             72     return Result;
             73 }
             74 
             75 void Parse()
             76 {
             77     VL_CpLexer Lexer;
             78     Lexer
             79         <<Token(false,L"(",tiLeft)
             80         <<Token(false,L")",tiRight)
             81         <<Token(false,L"+",tiAdd)
             82         <<Token(false,L"-",tiSub)
             83         <<Token(false,L"*",tiMul)
             84         <<Token(false,L"/",tiDiv)
             85         <<Token(false,_Float,tiNumber)
             86         ;
             87 
             88     _Wrapper<VL_CpTokenNodePtr , VDouble> Factor,Term,Expr;
             89     Factor    = (Number<<=Token(tiNumber)) | (RemoveBracket <<= Token(tiLeft) + Expr + Token(tiRight));
             90     Term    = Calculate <<= Factor + *((Op<<=Token(tiMul)|Token(tiDiv)) + Factor);
             91     Expr    = Calculate <<= Term + *((Op<<=Token(tiAdd)|Token(tiSub)) + Term);
             92 
             93     VL_CpParser<VL_CpTokenNodePtr , VDouble> p=Expr;
             94     VL_CpParser<VL_CpTokenNodePtr , VDouble>::_FullResult Value=p.Parse(Lexer.Parse(L"(1+2)*(3+4)").First.Head);
             95     GetConsole()->Write(L"結果:\t"+VUnicodeString(Value.Head->Data.First)+L"\r\n");
             96 }
             97 
             98 void vlmain()
             99 {
            100     GetConsole()->SetTitle(L"Vczh Combinator Parser");
            101     GetConsole()->SetTestMemoryLeaks(true);
            102     GetConsole()->SetPauseOnExit(true);
            103 
            104     Parse();
            105 }


                點擊這里下載。
            posted on 2009-04-03 01:21 陳梓瀚(vczh) 閱讀(6310) 評論(9)  編輯 收藏 引用 所屬分類: 作品

            評論:
            # re: C++輕量級可配置語法分析器(開源) 2009-04-03 03:20 | CPP09
            Another lightweight parser combinator?  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源)[未登錄] 2009-04-03 04:00 | david
            請教可配置的含義是什么?  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2009-04-03 04:19 | 1shou
            問題是 你的頭文件里面包含了些什么東東?  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2009-04-03 04:30 | 1shou
            走眼了。。呵呵,,原來沒用你以前的 頭文件了呵。  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2009-04-03 04:43 | 陳梓瀚(vczh)
            @david
            也就是說,被分析的字符串的格式可以讓你輕松表達,分析過程不用你管的意思。我下午用這個東西小庫寫了個四則運算到語法樹的代碼,只需5分鐘。  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2009-04-03 04:45 | 陳梓瀚(vczh)
            @CPP09
            這個是無聊弄著玩的,參考Graham Hutton寫的《Higher-Order Functions for Parsing》。純函數(shù)式語言跟C++的模板還真是像啊。  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2009-04-04 06:14 | 陳梓瀚(vczh)
            還真是發(fā)現(xiàn)了些bug。  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2012-04-28 04:52 | anna
            想問一下博主,這個代碼里讓用戶自己輸入regex,并通過regex制造出NFA,在到DFA的代碼主要集中在哪一塊呢? 如果某個字符串匹配了,是否能輸出是命中了哪條規(guī)則呢?  回復  更多評論
              
            # re: C++輕量級可配置語法分析器(開源) 2012-04-28 05:21 | 陳梓瀚(vczh)
            @anna
            能,因為一個我每一個DFA終結狀態(tài)都保存了他是屬于哪條regex的。  回復  更多評論
              
            久久国产欧美日韩精品| 四虎国产精品成人免费久久| 日韩久久无码免费毛片软件| 97精品伊人久久大香线蕉app| 久久精品免费一区二区| 久久久国产视频| 久久久久久国产精品美女| 亚洲精品WWW久久久久久 | 精品久久久无码人妻中文字幕| 日韩欧美亚洲国产精品字幕久久久 | 久久亚洲国产精品一区二区| 国产亚洲综合久久系列| 久久被窝电影亚洲爽爽爽| 久久精品国产只有精品2020| 亚洲伊人久久大香线蕉苏妲己| 精品欧美一区二区三区久久久| 欧美一级久久久久久久大片| 亚洲午夜无码AV毛片久久| 一本色道久久综合亚洲精品| 久久久无码精品亚洲日韩按摩| 精品久久久久久无码中文字幕一区 | 国产精品嫩草影院久久| 精品视频久久久久| 一本久久a久久精品亚洲| 99999久久久久久亚洲| 久久亚洲精品无码观看不卡| 久久久精品人妻一区二区三区蜜桃| 精品综合久久久久久888蜜芽| 国产69精品久久久久9999| 久久天天躁夜夜躁狠狠| 亚洲国产成人久久综合一| 热久久国产欧美一区二区精品| 色欲久久久天天天综合网精品 | 亚洲伊人久久综合影院| 久久国产精品一国产精品金尊| 国产免费福利体检区久久 | 无码国内精品久久综合88| WWW婷婷AV久久久影片| 国产成人综合久久精品红| 久久er热视频在这里精品| 久久婷婷五月综合97色直播|