• <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

                今天照著C Minus的語法(略有修改)設計出了C Minus的語法樹。語法樹的設計盡量讓生成語法樹的代碼易于編寫。每一個結構的意義十分明確,而且結構與結構之間不需要有相互聯系。舉個例子,在生成語法樹的時候,一個變量定義“Point p;”由兩部分組成。其中第一部分是字符串"Point"而不是指向一個類型定義的指針TypeDeclaration*。當然至于Point代表什么,自有語義分析器代為理解。

                過幾天等畢業論文初稿寫完了,我將使用Vczh Combinator Parser為C Minus構造語法分析器。前天為Vczh Combinator Parser加上了錯誤處理的能力,至此這個工具已經可以為編譯器服務了。

                語法樹分為四大部分,其功能由四套類繼承結構承擔,基類分別是:
                VL_CMinusType:類型表達式
                VL_CMinusExpression:值表達式
                VL_CMinusStatement:語句表達式
                VL_CMinusDeclaration:程序全局對象聲明

                下面是語法樹的代碼:

              1 /*******************************************************************************
              2 Vczh Library++ 2.0
              3 JIT::C簡化版語法樹
              4 開發者:陳梓瀚
              5 *******************************************************************************/
              6 #ifndef VL_JIT_CMINUS
              7 #define VL_JIT_CMINUS
              8 
              9 #include "..\..\..\Data\Data\VL_Data_Basic.h"
             10 #include "..\..\..\Data\Data\VL_Data_String.h"
             11 #include "..\..\..\Data\Data\VL_Data_List.h"
             12 #include "..\..\..\Data\Data\VL_Data_Map.h"
             13 
             14 namespace vl
             15 {
             16     namespace jit
             17     {
             18         namespace cminus
             19         {
             20             using namespace collection;
             21 
             22             class VL_CMinusExpressionInfo : public VL_Base
             23             {
             24             public:
             25                 VInt                            Line;
             26 
             27                 VL_CMinusExpressionInfo();
             28             };
             29 
             30 /*********************************************************************************************************
             31 類型表達式
             32 *********************************************************************************************************/
             33 
             34             class VL_CMinusType : public VL_Base
             35             {
             36             public:
             37                 typedef VL_AutoPtr<VL_CMinusType>                            Ptr;
             38                 typedef VL_List<Ptr , false , VL_CMinusType>                List;
             39                 typedef VL_List<VL_Fullpair<VUnicodeString , Ptr> , false>    NamedList;
             40 
             41                 VL_CMinusExpressionInfo            Info;
             42             };
             43 
             44             class VL_CMinusNamedType : public VL_CMinusType
             45             {
             46             public:
             47                 VUnicodeString                    Name;
             48 
             49                 VL_CMinusNamedType();
             50                 VL_CMinusNamedType(VUnicodeString aName);
             51             };
             52 
             53             class VL_CMinusPointerType : public VL_CMinusType
             54             {
             55             public:
             56                 VL_CMinusType::Ptr                Type;
             57 
             58                 VL_CMinusPointerType();
             59                 VL_CMinusPointerType(VL_CMinusType::Ptr aType);
             60             };
             61 
             62             class VL_CMinusArrayType : public VL_CMinusType
             63             {
             64             public:
             65                 VL_CMinusType::Ptr                Type;
             66                 VInt                            Count;
             67 
             68                 VL_CMinusArrayType();
             69                 VL_CMinusArrayType(VL_CMinusType::Ptr aType , VInt aCount);
             70             };
             71 
             72             class VL_CMinusFunctionType : public VL_CMinusType
             73             {
             74             public:
             75                 VL_CMinusType::Ptr                ReturnType;
             76                 VL_CMinusType::List                ParameterTypes;
             77 
             78                 VL_CMinusFunctionType();
             79                 VL_CMinusFunctionType(VL_CMinusType::Ptr aReturnType , VL_CMinusType::List& aParameterTypes);
             80             };
             81 
             82             class VL_CMinusStructType : public VL_CMinusType
             83             {
             84             public:
             85                 VL_CMinusType::NamedList        MemberTypes;
             86 
             87                 VL_CMinusStructType();
             88                 VL_CMinusStructType(VL_CMinusType::NamedList& aMemberTypes);
             89             };
             90 
             91 /*********************************************************************************************************
             92 值表達式
             93 *********************************************************************************************************/
             94 
             95             class VL_CMinusExpression : public VL_Base
             96             {
             97             public:
             98                 typedef VL_AutoPtr<VL_CMinusExpression>                        Ptr;
             99                 typedef VL_List<Ptr , false , VL_CMinusExpression>            List;
            100                 typedef VL_List<VL_Fullpair<VUnicodeString , Ptr> , false>    NamedList;
            101 
            102                 VL_CMinusExpressionInfo            Info;
            103             };
            104 
            105             enum VLE_CMinusPrimitiveKind
            106             {
            107                 vcpkInt,
            108                 vcpkFloat,
            109                 vcpkBool,
            110                 vcpkChar,
            111                 vcpkWChar,
            112                 vcpkString,
            113                 vcpkWString,
            114                 vcpkName,
            115                 vcpkNull
            116             };
            117             class VL_CMinusPrimitiveExpression : public VL_CMinusExpression
            118             {
            119             public:
            120                 VLE_CMinusPrimitiveKind            Kind;
            121                 VInt                            IntValue;
            122                 VDouble                            FloatValue;
            123                 VBool                            BoolValue;
            124                 VWChar                            CharValue;
            125                 VUnicodeString                    StringValue;
            126 
            127                 VL_CMinusPrimitiveExpression(VInt Value);
            128                 VL_CMinusPrimitiveExpression(VDouble Value);
            129                 VL_CMinusPrimitiveExpression(VBool Value);
            130                 VL_CMinusPrimitiveExpression(VWChar Value , VBool Unicode);
            131                 VL_CMinusPrimitiveExpression(VUnicodeString Value , VBool Unicode);
            132                 VL_CMinusPrimitiveExpression(VUnicodeString Value);
            133             };
            134 
            135             enum VLE_CMinusUnaryOperator
            136             {
            137                 vcuoPositive,
            138                 vcuoNegative,
            139                 vcuoBitNot,
            140                 vcuoNot,
            141                 vcboAddress,
            142                 vcboValue
            143             };
            144             class VL_CMinusUnaryExpression : public VL_CMinusExpression
            145             {
            146             public:
            147                 VLE_CMinusUnaryOperator            Operator;
            148                 VL_CMinusExpression::Ptr        Expression;
            149 
            150                 VL_CMinusUnaryExpression();
            151                 VL_CMinusUnaryExpression(VLE_CMinusUnaryOperator aOperator , VL_CMinusExpression::Ptr aExpression);
            152             };
            153 
            154             enum VLE_CMinusBinaryOperator
            155             {
            156                 vcboAdd,
            157                 vcboSub,
            158                 vcboMul,
            159                 vcboDiv,
            160                 vcboMod,
            161                 vcboBitAnd,
            162                 vcboBitOr,
            163                 vcboBitXor,
            164                 vcboAnd,
            165                 vcboOr,
            166                 vcboXor,
            167                 vcboLess,
            168                 vcboLessAndEqual,
            169                 vcboGreater,
            170                 vcboGreaterAndEqual,
            171                 vcboEqual,
            172                 vcboNotEqual,
            173                 vcboSubScript,
            174             };
            175             class VL_CMinusBinaryExpression : public VL_CMinusExpression
            176             {
            177             public:
            178                 VLE_CMinusBinaryOperator        Operator;
            179                 VL_CMinusExpression::Ptr        Left;
            180                 VL_CMinusExpression::Ptr        Right;
            181 
            182                 VL_CMinusBinaryExpression();
            183                 VL_CMinusBinaryExpression(VLE_CMinusBinaryOperator aOperator , VL_CMinusExpression::Ptr aLeft , VL_CMinusExpression::Ptr aRight);
            184             };
            185 
            186             class VL_CMinusInvokeExpression : public VL_CMinusExpression
            187             {
            188             public:
            189                 VL_CMinusExpression::Ptr        Function;
            190                 VL_CMinusExpression::List        Parameters;
            191 
            192                 VL_CMinusInvokeExpression();
            193                 VL_CMinusInvokeExpression(VL_CMinusExpression::Ptr aFunction , VL_CMinusExpression::List& aParameters);
            194             };
            195 
            196             class VL_CMinusTypeCastExpression : public VL_CMinusExpression
            197             {
            198             public:
            199                 VL_CMinusType::Ptr                Type;
            200                 VL_CMinusExpression::Ptr        Expression;
            201 
            202                 VL_CMinusTypeCastExpression();
            203                 VL_CMinusTypeCastExpression(VL_CMinusType::Ptr aType , VL_CMinusExpression::Ptr aExpression);
            204             };
            205 
            206             class VL_CMinusArrayBuildingExpression : public VL_CMinusExpression
            207             {
            208             public:
            209                 VL_CMinusType::Ptr                Type;
            210                 VL_CMinusExpression::List        Expressions;
            211 
            212                 VL_CMinusArrayBuildingExpression();
            213                 VL_CMinusArrayBuildingExpression(VL_CMinusType::Ptr aType , VL_CMinusExpression::List& aExpressions);
            214             };
            215 
            216             class VL_CMinusStructBuildingExpression : public VL_CMinusExpression
            217             {
            218             public:
            219                 VL_CMinusType::Ptr                Type;
            220                 VL_CMinusExpression::NamedList    MemberValues;
            221 
            222                 VL_CMinusStructBuildingExpression();
            223                 VL_CMinusStructBuildingExpression(VL_CMinusType::Ptr aType , VL_CMinusExpression::NamedList& aMemberValues);
            224             };
            225 
            226 /*********************************************************************************************************
            227 語句表達式
            228 *********************************************************************************************************/
            229 
            230             class VL_CMinusStatement : public VL_Base
            231             {
            232             public:
            233                 typedef VL_AutoPtr<VL_CMinusStatement>                Ptr;
            234                 typedef VL_List<Ptr , false , VL_CMinusStatement*>    List;
            235 
            236                 VL_CMinusExpressionInfo            Info;
            237             };
            238 
            239             class VL_CMinusVariableStatement : public VL_CMinusStatement
            240             {
            241             public:
            242                 VBool                            Const;
            243                 VUnicodeString                    Name;
            244                 VL_CMinusType::Ptr                Type;
            245                 VL_CMinusExpression::Ptr        Expression;
            246 
            247                 VL_CMinusVariableStatement();
            248                 VL_CMinusVariableStatement(VBool aConst , VUnicodeString aName , VL_CMinusType::Ptr aType , VL_CMinusExpression::Ptr aExpression);
            249             };
            250 
            251             class VL_CMinusExpressionStatement : public VL_CMinusStatement
            252             {
            253             public:
            254                 VL_CMinusExpression::Ptr        Expression;
            255 
            256                 VL_CMinusExpressionStatement();
            257                 VL_CMinusExpressionStatement(VL_CMinusExpression::Ptr aExpression);
            258             };
            259 
            260             enum VLE_CMinusAssignmentOperator
            261             {
            262                 vcaoAssignment,
            263                 vcaoAdd,
            264                 vcaoSub,
            265                 vcaoMul,
            266                 vcaoDiv,
            267                 vcaoMod,
            268                 vcaoBitAnd,
            269                 vcaoBitOr,
            270                 vcaoBitXor,
            271                 vcaoAnd,
            272                 vcaoOr,
            273                 vcaoXor
            274             };
            275             class VL_CMinusAssignmentStatement : public VL_CMinusStatement
            276             {
            277             public:
            278                 VLE_CMinusAssignmentOperator    Operator;
            279                 VL_CMinusExpression::Ptr        Left;
            280                 VL_CMinusExpression::Ptr        Right;
            281 
            282                 VL_CMinusAssignmentStatement();
            283                 VL_CMinusAssignmentStatement(VLE_CMinusAssignmentOperator aOperator , VL_CMinusExpression::Ptr aLeft , VL_CMinusExpression::Ptr aRight);
            284             };
            285 
            286             class VL_CMinusIfStatement : public VL_CMinusStatement
            287             {
            288             public:
            289                 VL_CMinusExpression::Ptr        Condition;
            290                 VL_CMinusStatement::Ptr            TrueBody;
            291                 VL_CMinusStatement::Ptr            FalseBody;
            292 
            293                 VL_CMinusIfStatement();
            294                 VL_CMinusIfStatement(VL_CMinusExpression::Ptr aCondition , VL_CMinusStatement::Ptr aTrueBody , VL_CMinusStatement::Ptr aFalseBody);
            295             };
            296 
            297             class VL_CMinusWhileStatement : public VL_CMinusStatement
            298             {
            299             public:
            300                 VL_CMinusExpression::Ptr        Condition;
            301                 VL_CMinusStatement::Ptr            Body;
            302 
            303                 VL_CMinusWhileStatement();
            304                 VL_CMinusWhileStatement(VL_CMinusExpression::Ptr aCondition , VL_CMinusStatement::Ptr aBody);
            305             };
            306 
            307             class VL_CMinusDoWhileStatement : public VL_CMinusStatement
            308             {
            309             public:
            310                 VL_CMinusExpression::Ptr        Condition;
            311                 VL_CMinusStatement::Ptr            Body;
            312 
            313                 VL_CMinusDoWhileStatement();
            314                 VL_CMinusDoWhileStatement(VL_CMinusExpression::Ptr aCondition , VL_CMinusStatement::Ptr aBody);
            315             };
            316 
            317             class VL_CMinusBreakStatement : public VL_CMinusStatement
            318             {
            319             public:
            320             };
            321 
            322             class VL_CMinusContinueStatement : public VL_CMinusStatement
            323             {
            324             public:
            325             };
            326 
            327             class VL_CMinusReturnStatement : public VL_CMinusStatement
            328             {
            329             public:
            330                 VL_CMinusExpression::Ptr        Expression;
            331 
            332                 VL_CMinusReturnStatement();
            333                 VL_CMinusReturnStatement(VL_CMinusExpression::Ptr aExpression);
            334             };
            335 
            336             class VL_CMinusBlockStatement : public VL_CMinusStatement
            337             {
            338             public:
            339                 VL_CMinusStatement::List        Statements;
            340 
            341                 VL_CMinusBlockStatement();
            342                 VL_CMinusBlockStatement(VL_CMinusStatement::List& aStatements);
            343             };
            344 
            345 /*********************************************************************************************************
            346 程序結構
            347 *********************************************************************************************************/
            348 
            349             class VL_CMinusDeclaration : public VL_Base
            350             {
            351             public:
            352                 typedef VL_AutoPtr<VL_CMinusDeclaration>                Ptr;
            353                 typedef VL_List<Ptr , false , VL_CMinusDeclaration*>    List;
            354 
            355                 VL_CMinusExpressionInfo            Info;
            356                 VUnicodeString                    Name;
            357             };
            358 
            359             class VL_CMinusTypeDeclaration : public VL_CMinusDeclaration
            360             {
            361             public:
            362                 VL_CMinusType::Ptr                Type;
            363 
            364                 VL_CMinusTypeDeclaration();
            365                 VL_CMinusTypeDeclaration(VUnicodeString aName , VL_CMinusType::Ptr aType);
            366             };
            367 
            368             class VL_CMinusVariableDeclaration : public VL_CMinusDeclaration
            369             {
            370             public:
            371                 VBool                            Const;
            372                 VL_CMinusType::Ptr                Type;
            373                 VL_CMinusExpression::Ptr        Expression;
            374 
            375                 VL_CMinusVariableDeclaration();
            376                 VL_CMinusVariableDeclaration(VUnicodeString aName , VBool aConst , VL_CMinusType::Ptr aType , VL_CMinusExpression::Ptr aExpression);
            377             };
            378 
            379             class VL_CMinusFunctionDeclaration : public VL_CMinusDeclaration
            380             {
            381             public:
            382                 VL_CMinusType::Ptr                ReturnType;
            383                 VL_CMinusType::NamedList        ParameterTypes;
            384                 VL_CMinusStatement::Ptr            Body;
            385 
            386                 VL_CMinusFunctionDeclaration();
            387                 VL_CMinusFunctionDeclaration(VUnicodeString aName , VL_CMinusType::Ptr aReturnType , VL_CMinusType::NamedList& aParameterTypes , VL_CMinusStatement::Ptr aBody);
            388             };
            389 
            390             class VL_CMinusExternalFunctionDeclaration : public VL_CMinusDeclaration
            391             {
            392             public:
            393                 VL_CMinusType::Ptr                ReturnType;
            394                 VL_CMinusType::List                ParameterTypes;
            395                 VUnicodeString                    Alias;
            396 
            397                 VL_CMinusExternalFunctionDeclaration();
            398                 VL_CMinusExternalFunctionDeclaration(VUnicodeString aName , VL_CMinusType::Ptr aReturnType , VL_CMinusType::List& aParameterTypes , VUnicodeString aAlias);
            399             };
            400 
            401             class VL_CMinusProgram : public VL_Base
            402             {
            403             public:
            404                 VL_CMinusDeclaration::List        Declarations;
            405             };
            406         }
            407     }
            408 }
            409 
            410 #endif
            posted on 2009-04-24 00:58 陳梓瀚(vczh) 閱讀(3072) 評論(5)  編輯 收藏 引用 所屬分類: JIT

            評論:
            # re: JIT腳本引擎:C Minus語言語法樹定型 2009-04-26 22:42 | yindf
            整個定義看起來很清晰,不知道后面的實現怎么樣?  回復  更多評論
              
            # re: JIT腳本引擎:C Minus語言語法樹定型 2009-04-27 05:33 | 陳梓瀚(vczh)
            語法分析不是接口的一部分,是用來給測試程序調用的,所以再爛都無所謂。不過我用了之前自己做的combinator parser,寫得再亂也很清晰。  回復  更多評論
              
            # re: JIT腳本引擎:C Minus語言語法樹定型 2009-04-28 16:58 | 空明流轉
            @陳梓瀚(vczh)
            NO,這個最清晰了:我在QQ上喊一句,vc啊,幫我做個編譯器吧。你就幫我把方案搞定,嘎嘎。  回復  更多評論
              
            # re: JIT腳本引擎:C Minus語言語法樹定型 2009-04-29 09:20 | au
            bu cuo  回復  更多評論
              
            # re: JIT腳本引擎:C Minus語言語法樹定型 2009-05-18 16:29 | 旱圣
            T_T.........
            沒看懂。。。。。  回復  更多評論
              
            久久影院久久香蕉国产线看观看| 亚洲AV乱码久久精品蜜桃| 久久久无码精品亚洲日韩按摩 | 麻豆成人久久精品二区三区免费| 久久久久久久国产免费看| 99久久国产亚洲高清观看2024 | 国产精品gz久久久| 大香网伊人久久综合网2020| 青青青国产精品国产精品久久久久| 国内精品久久久久影院一蜜桃| 亚洲av成人无码久久精品| 亚洲国产精品无码久久久蜜芽 | 久久99精品国产自在现线小黄鸭 | 久久se精品一区二区影院| 国产毛片久久久久久国产毛片 | 欧美一级久久久久久久大片| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 国产精品综合久久第一页| 久久婷婷五月综合色99啪ak| 伊人色综合九久久天天蜜桃| 亚洲精品乱码久久久久久按摩 | 久久99久国产麻精品66| 无码专区久久综合久中文字幕| 久久99亚洲网美利坚合众国| 亚洲嫩草影院久久精品| 久久有码中文字幕| 久久久久高潮毛片免费全部播放| 四虎国产精品免费久久久| 日本加勒比久久精品| 日产精品99久久久久久| 国产精品成人99久久久久91gav| 国内精品久久久久影院亚洲| 精品午夜久久福利大片| 久久91精品国产91| 亚洲国产精品一区二区久久| 久久精品人妻中文系列| 国产成人综合久久久久久 | 亚洲精品无码专区久久久| 国产午夜精品久久久久九九电影| 久久人人爽人人爽人人片AV不 | 天堂无码久久综合东京热|