• <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#寫的文法產生出C#寫的該文法對應的語法分析器。在寫文法的時候你需要提供每一個文法的返回類型,以及指定每一個屬性究竟對應著文法的哪一段。為了方便,我提供了預定義的列表文法和左遞歸文法。當然我們知道手寫遞歸下降分析器都是有套路的,用人寫的話只會浪費人類的時間。文法的寫法跟之前Vczh Library++ 3.0Parser Combinator比較類似,現在讓我們看一下C#是如何表達文法的。這篇文章的所有相關代碼(語法樹、文法、生成的分析器代碼以及生成器的代碼)都可以在Vczh Library++ 3.0下面找到。過幾天再更加嚴格的測試幾次之后,就可以開始給NativeX寫語法分析器了。一旦完成了之后,就可以寫一個簡單的類型推到程序,這樣就可以在輸入"."和"->"之后產生自動下拉列表啦。

                為了測試語法分析器生成器,我給我的測試程序寫了一個帶函數的四則運算式子的文法。這個東西的文法應該是老掉牙的了,不用想都能寫出來:
             1 using System;
             2 using System.Collections.Generic;
             3 using System.Linq;
             4 using System.Text;
             5 using CodeBoxControl.CodeProvider.ParserCodeGenerator;
             6 using CodeBoxControlTest.CodeParser;
             7 
             8 namespace ParserBuilder
             9 {
            10     class CodeParserTestParserBuilder : Parser
            11     {
            12         public static string Build()
            13         {
            14             var ID = id("CodeBoxControlTest.CodeParser.CodeParserTokenizer.IdToken");
            15             var Number = id("CodeBoxControlTest.CodeParser.CodeParserTokenizer.NumberToken");
            16             var FUNCTION = rule<FunctionExpression>("Function");
            17             var NUMBER = rule<NumberExpression>("Number");
            18             var BRACKET = rule<Expression>("Bracket");
            19             var FACTOR = rule<Expression>("Factor");
            20             var TERM = rule<Expression>("Term");
            21             var EXPRESSION = rule<Expression>("Expression");
            22 
            23             FUNCTION.Infer(
            24               ID["Name"+ tok("("+ list<Expression>(tok(","), EXPRESSION)["Parameters"+ tok(")")
            25             );
            26 
            27             NUMBER.Infer(
            28               Number["Number"]
            29             );
            30 
            31             BRACKET.Infer(
            32               tok("("+ ret(EXPRESSION) + tok(")")
            33             );
            34 
            35             FACTOR.Infer(
            36               ret(NUMBER) | ret(FUNCTION) | ret(BRACKET)
            37             );
            38 
            39             TERM.Infer(
            40               ret(leftrec<BinaryExpression>(FACTOR["Left"], (tok("*")["Operator"| tok("/")["Operator"]) + FACTOR["Right"]))
            41             );
            42 
            43             EXPRESSION.Infer(
            44               ret(leftrec<BinaryExpression>(TERM["Left"], (tok("+")["Operator"| tok("-")["Operator"]) + TERM["Right"]))
            45             );
            46 
            47             return ParserGenerator.GenerateCSharpCode(EXPRESSION, "CodeBoxControlTest.CodeParser""CodeParserAnalyzer");
            48         }
            49     }
            50 }
            51 

                在這里解釋兩條文法。首先是FUNCTION,FUNCTION由函數名和參數表格構成。函數名指定給了Name屬性,而參數表則指定給了Parameters屬性。這里我們可以看到list函數需要指定元素的類型以及元素與元素之間的分隔符。當然分隔符也可以是一條復雜的文法。其次是TERM。這是一個左遞歸的寫法。首先leftrec<T>(a, b)的返回類型是a的類型,而T則指的是當需要左遞歸的時候元素的實際類型,并且a和b所標注的屬性名都是T的屬性。

                因此下面給出語法樹的聲明:
             1 using System;
             2 using System.Collections.Generic;
             3 using System.Linq;
             4 using System.Text;
             5 using CodeBoxControl.CodeProvider;
             6 
             7 namespace CodeBoxControlTest.CodeParser
             8 {
             9     public abstract class Expression : CodeNode
            10     {
            11     }
            12 
            13     public abstract class NumberExpression : Expression
            14     {
            15         public double Number { getset; }
            16     }
            17 
            18     public abstract class BinaryExpression : Expression
            19     {
            20         public abstract Expression Left { getset; }
            21         public abstract Expression Right { getset; }
            22         public string Operator { getset; }
            23     }
            24 
            25     public abstract class FunctionExpression : Expression
            26     {
            27         public string Name { getset; }
            28         public abstract CodeNodeList<Expression> Parameters { getset; }
            29     }
            30 }
            31 

                還是比較短的哈。有了list和leftrec之后就充分解決了復雜文法的通用模式,因此就產生了下面這個很齷齪的、有很多廢話的代碼:
              1 using System;
              2 using System.Collections.Generic;
              3 using System.Linq;
              4 using System.Text;
              5 using CodeBoxControl.CodeProvider;
              6 
              7 namespace CodeBoxControlTest.CodeParser
              8 {
              9     public static class CodeParserAnalyzer
             10     {
             11         public static CodeBoxControlTest.CodeParser.Expression ParseExpression(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
             12         {
             13             CodeBoxControlTest.CodeParser.Expression result = default(CodeBoxControlTest.CodeParser.Expression);
             14             {
             15                 CodeBoxControlTest.CodeParser.Expression result1 = default(CodeBoxControlTest.CodeParser.Expression);
             16                 int currentIndex1 = currentToken;
             17                 {
             18                     {
             19                         int currentIndex2 = currentIndex1;
             20                         {
             21                             parseSuccess = false;
             22                             result1 = ParseTerm(tokens, ref currentIndex2, ref parseSuccess);
             23                         }
             24                         if (parseSuccess)
             25                         {
             26                             currentIndex1 = currentIndex2;
             27                         }
             28                         else
             29                         {
             30                             goto LABEL_0;
             31                         }
             32                         while (true)
             33                         {
             34                             System.String OperatorMember2 = default(System.String);
             35                             CodeBoxControlTest.CodeParser.Expression RightMember2 = default(CodeBoxControlTest.CodeParser.Expression);
             36                             {
             37                                 System.String OperatorMember3 = default(System.String);
             38                                 CodeBoxControlTest.CodeParser.Expression RightMember3 = default(CodeBoxControlTest.CodeParser.Expression);
             39                                 {
             40                                     int currentIndexCopy4 = currentIndex2;
             41                                     int currentIndex4 = currentIndex2;
             42                                     {
             43                                         System.String OperatorMember4 = default(System.String);
             44                                         {
             45                                             int currentIndex5 = -1;
             46                                             currentIndex5 = currentIndex4;
             47                                             {
             48                                                 System.String OperatorMember5 = default(System.String);
             49                                                 {
             50                                                     CodeBoxControl.CodeProvider.CodeToken result6 = default(CodeBoxControl.CodeProvider.CodeToken);
             51                                                     int currentIndex6 = currentIndex5;
             52                                                     {
             53                                                         parseSuccess = false;
             54                                                         if (currentIndex6 < tokens.Count && tokens[currentIndex6].Value == "+")
             55                                                         {
             56                                                             result6 = tokens[currentIndex6];
             57                                                             currentIndex6++;
             58                                                             parseSuccess = true;
             59                                                         }
             60                                                     }
             61                                                     if (parseSuccess)
             62                                                     {
             63                                                         currentIndex5 = currentIndex6;
             64                                                         OperatorMember5 = result6.Value;
             65                                                     }
             66                                                 }
             67                                                 OperatorMember4 = OperatorMember5;
             68                                             }
             69                                             if (parseSuccess)
             70                                             {
             71                                                 currentIndex4 = currentIndex5;
             72                                                 goto LABEL_SUCCESS_2;
             73                                             }
             74                                             currentIndex5 = currentIndex4;
             75                                             {
             76                                                 System.String OperatorMember5 = default(System.String);
             77                                                 {
             78                                                     CodeBoxControl.CodeProvider.CodeToken result6 = default(CodeBoxControl.CodeProvider.CodeToken);
             79                                                     int currentIndex6 = currentIndex5;
             80                                                     {
             81                                                         parseSuccess = false;
             82                                                         if (currentIndex6 < tokens.Count && tokens[currentIndex6].Value == "-")
             83                                                         {
             84                                                             result6 = tokens[currentIndex6];
             85                                                             currentIndex6++;
             86                                                             parseSuccess = true;
             87                                                         }
             88                                                     }
             89                                                     if (parseSuccess)
             90                                                     {
             91                                                         currentIndex5 = currentIndex6;
             92                                                         OperatorMember5 = result6.Value;
             93                                                     }
             94                                                 }
             95                                                 OperatorMember4 = OperatorMember5;
             96                                             }
             97                                             if (parseSuccess)
             98                                             {
             99                                                 currentIndex4 = currentIndex5;
            100                                                 goto LABEL_SUCCESS_2;
            101                                             }
            102                                             goto LABEL_FAIL_3;
            103                                         LABEL_SUCCESS_2: ;
            104                                         LABEL_FAIL_3: ;
            105                                         }
            106                                         OperatorMember3 = OperatorMember4;
            107                                     }
            108                                     if (parseSuccess)
            109                                     {
            110                                         currentIndexCopy4 = currentIndex4;
            111                                     }
            112                                     else
            113                                     {
            114                                         goto LABEL_1;
            115                                     }
            116                                     {
            117                                         CodeBoxControlTest.CodeParser.Expression RightMember4 = default(CodeBoxControlTest.CodeParser.Expression);
            118                                         {
            119                                             CodeBoxControlTest.CodeParser.Expression result5 = default(CodeBoxControlTest.CodeParser.Expression);
            120                                             int currentIndex5 = currentIndex4;
            121                                             {
            122                                                 parseSuccess = false;
            123                                                 result5 = ParseTerm(tokens, ref currentIndex5, ref parseSuccess);
            124                                             }
            125                                             if (parseSuccess)
            126                                             {
            127                                                 currentIndex4 = currentIndex5;
            128                                                 RightMember4 = result5;
            129                                             }
            130                                         }
            131                                         RightMember3 = RightMember4;
            132                                     }
            133                                     if (parseSuccess)
            134                                     {
            135                                         currentIndexCopy4 = currentIndex4;
            136                                     }
            137                                     else
            138                                     {
            139                                         goto LABEL_1;
            140                                     }
            141                                     currentIndex2 = currentIndexCopy4;
            142                                 LABEL_1: ;
            143                                 }
            144                                 OperatorMember2 = OperatorMember3;
            145                                 RightMember2 = RightMember3;
            146                             }
            147                             if (parseSuccess)
            148                             {
            149                                 currentIndex1 = currentIndex2;
            150                                 CodeBoxControlTest.CodeParser.BinaryExpression result2 = CodeNode.Create<CodeBoxControlTest.CodeParser.BinaryExpression>();
            151                                 result2.Operator = OperatorMember2;
            152                                 result2.Right = RightMember2;
            153                                 result2.Left = result1;
            154                                 result1 = result2;
            155                             }
            156                             else
            157                             {
            158                                 break;
            159                             }
            160                         }
            161                         parseSuccess = true;
            162                     LABEL_0: ;
            163                     }
            164                 }
            165                 if (parseSuccess)
            166                 {
            167                     currentToken = currentIndex1;
            168                     result = result1;
            169                 }
            170             }
            171             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.Expression>();
            172             return result;
            173         }
            174 
            175         public static CodeBoxControlTest.CodeParser.Expression ParseTerm(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
            176         {
            177             CodeBoxControlTest.CodeParser.Expression result = default(CodeBoxControlTest.CodeParser.Expression);
            178             {
            179                 CodeBoxControlTest.CodeParser.Expression result1 = default(CodeBoxControlTest.CodeParser.Expression);
            180                 int currentIndex1 = currentToken;
            181                 {
            182                     {
            183                         int currentIndex2 = currentIndex1;
            184                         {
            185                             parseSuccess = false;
            186                             result1 = ParseFactor(tokens, ref currentIndex2, ref parseSuccess);
            187                         }
            188                         if (parseSuccess)
            189                         {
            190                             currentIndex1 = currentIndex2;
            191                         }
            192                         else
            193                         {
            194                             goto LABEL_0;
            195                         }
            196                         while (true)
            197                         {
            198                             System.String OperatorMember2 = default(System.String);
            199                             CodeBoxControlTest.CodeParser.Expression RightMember2 = default(CodeBoxControlTest.CodeParser.Expression);
            200                             {
            201                                 System.String OperatorMember3 = default(System.String);
            202                                 CodeBoxControlTest.CodeParser.Expression RightMember3 = default(CodeBoxControlTest.CodeParser.Expression);
            203                                 {
            204                                     int currentIndexCopy4 = currentIndex2;
            205                                     int currentIndex4 = currentIndex2;
            206                                     {
            207                                         System.String OperatorMember4 = default(System.String);
            208                                         {
            209                                             int currentIndex5 = -1;
            210                                             currentIndex5 = currentIndex4;
            211                                             {
            212                                                 System.String OperatorMember5 = default(System.String);
            213                                                 {
            214                                                     CodeBoxControl.CodeProvider.CodeToken result6 = default(CodeBoxControl.CodeProvider.CodeToken);
            215                                                     int currentIndex6 = currentIndex5;
            216                                                     {
            217                                                         parseSuccess = false;
            218                                                         if (currentIndex6 < tokens.Count && tokens[currentIndex6].Value == "*")
            219                                                         {
            220                                                             result6 = tokens[currentIndex6];
            221                                                             currentIndex6++;
            222                                                             parseSuccess = true;
            223                                                         }
            224                                                     }
            225                                                     if (parseSuccess)
            226                                                     {
            227                                                         currentIndex5 = currentIndex6;
            228                                                         OperatorMember5 = result6.Value;
            229                                                     }
            230                                                 }
            231                                                 OperatorMember4 = OperatorMember5;
            232                                             }
            233                                             if (parseSuccess)
            234                                             {
            235                                                 currentIndex4 = currentIndex5;
            236                                                 goto LABEL_SUCCESS_2;
            237                                             }
            238                                             currentIndex5 = currentIndex4;
            239                                             {
            240                                                 System.String OperatorMember5 = default(System.String);
            241                                                 {
            242                                                     CodeBoxControl.CodeProvider.CodeToken result6 = default(CodeBoxControl.CodeProvider.CodeToken);
            243                                                     int currentIndex6 = currentIndex5;
            244                                                     {
            245                                                         parseSuccess = false;
            246                                                         if (currentIndex6 < tokens.Count && tokens[currentIndex6].Value == "/")
            247                                                         {
            248                                                             result6 = tokens[currentIndex6];
            249                                                             currentIndex6++;
            250                                                             parseSuccess = true;
            251                                                         }
            252                                                     }
            253                                                     if (parseSuccess)
            254                                                     {
            255                                                         currentIndex5 = currentIndex6;
            256                                                         OperatorMember5 = result6.Value;
            257                                                     }
            258                                                 }
            259                                                 OperatorMember4 = OperatorMember5;
            260                                             }
            261                                             if (parseSuccess)
            262                                             {
            263                                                 currentIndex4 = currentIndex5;
            264                                                 goto LABEL_SUCCESS_2;
            265                                             }
            266                                             goto LABEL_FAIL_3;
            267                                         LABEL_SUCCESS_2: ;
            268                                         LABEL_FAIL_3: ;
            269                                         }
            270                                         OperatorMember3 = OperatorMember4;
            271                                     }
            272                                     if (parseSuccess)
            273                                     {
            274                                         currentIndexCopy4 = currentIndex4;
            275                                     }
            276                                     else
            277                                     {
            278                                         goto LABEL_1;
            279                                     }
            280                                     {
            281                                         CodeBoxControlTest.CodeParser.Expression RightMember4 = default(CodeBoxControlTest.CodeParser.Expression);
            282                                         {
            283                                             CodeBoxControlTest.CodeParser.Expression result5 = default(CodeBoxControlTest.CodeParser.Expression);
            284                                             int currentIndex5 = currentIndex4;
            285                                             {
            286                                                 parseSuccess = false;
            287                                                 result5 = ParseFactor(tokens, ref currentIndex5, ref parseSuccess);
            288                                             }
            289                                             if (parseSuccess)
            290                                             {
            291                                                 currentIndex4 = currentIndex5;
            292                                                 RightMember4 = result5;
            293                                             }
            294                                         }
            295                                         RightMember3 = RightMember4;
            296                                     }
            297                                     if (parseSuccess)
            298                                     {
            299                                         currentIndexCopy4 = currentIndex4;
            300                                     }
            301                                     else
            302                                     {
            303                                         goto LABEL_1;
            304                                     }
            305                                     currentIndex2 = currentIndexCopy4;
            306                                 LABEL_1: ;
            307                                 }
            308                                 OperatorMember2 = OperatorMember3;
            309                                 RightMember2 = RightMember3;
            310                             }
            311                             if (parseSuccess)
            312                             {
            313                                 currentIndex1 = currentIndex2;
            314                                 CodeBoxControlTest.CodeParser.BinaryExpression result2 = CodeNode.Create<CodeBoxControlTest.CodeParser.BinaryExpression>();
            315                                 result2.Operator = OperatorMember2;
            316                                 result2.Right = RightMember2;
            317                                 result2.Left = result1;
            318                                 result1 = result2;
            319                             }
            320                             else
            321                             {
            322                                 break;
            323                             }
            324                         }
            325                         parseSuccess = true;
            326                     LABEL_0: ;
            327                     }
            328                 }
            329                 if (parseSuccess)
            330                 {
            331                     currentToken = currentIndex1;
            332                     result = result1;
            333                 }
            334             }
            335             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.Expression>();
            336             return result;
            337         }
            338 
            339         public static CodeBoxControlTest.CodeParser.Expression ParseFactor(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
            340         {
            341             CodeBoxControlTest.CodeParser.Expression result = default(CodeBoxControlTest.CodeParser.Expression);
            342             {
            343                 CodeBoxControlTest.CodeParser.Expression result1 = default(CodeBoxControlTest.CodeParser.Expression);
            344                 int currentIndex1 = -1;
            345                 currentIndex1 = currentToken;
            346                 {
            347                     {
            348                         CodeBoxControlTest.CodeParser.NumberExpression result2 = default(CodeBoxControlTest.CodeParser.NumberExpression);
            349                         int currentIndex2 = currentIndex1;
            350                         {
            351                             parseSuccess = false;
            352                             result2 = ParseNumber(tokens, ref currentIndex2, ref parseSuccess);
            353                         }
            354                         if (parseSuccess)
            355                         {
            356                             currentIndex1 = currentIndex2;
            357                             result1 = result2;
            358                         }
            359                     }
            360                 }
            361                 if (parseSuccess)
            362                 {
            363                     currentToken = currentIndex1;
            364                     goto LABEL_SUCCESS_0;
            365                 }
            366                 currentIndex1 = currentToken;
            367                 {
            368                     {
            369                         CodeBoxControlTest.CodeParser.FunctionExpression result2 = default(CodeBoxControlTest.CodeParser.FunctionExpression);
            370                         int currentIndex2 = currentIndex1;
            371                         {
            372                             parseSuccess = false;
            373                             result2 = ParseFunction(tokens, ref currentIndex2, ref parseSuccess);
            374                         }
            375                         if (parseSuccess)
            376                         {
            377                             currentIndex1 = currentIndex2;
            378                             result1 = result2;
            379                         }
            380                     }
            381                 }
            382                 if (parseSuccess)
            383                 {
            384                     currentToken = currentIndex1;
            385                     goto LABEL_SUCCESS_0;
            386                 }
            387                 currentIndex1 = currentToken;
            388                 {
            389                     {
            390                         CodeBoxControlTest.CodeParser.Expression result2 = default(CodeBoxControlTest.CodeParser.Expression);
            391                         int currentIndex2 = currentIndex1;
            392                         {
            393                             parseSuccess = false;
            394                             result2 = ParseBracket(tokens, ref currentIndex2, ref parseSuccess);
            395                         }
            396                         if (parseSuccess)
            397                         {
            398                             currentIndex1 = currentIndex2;
            399                             result1 = result2;
            400                         }
            401                     }
            402                 }
            403                 if (parseSuccess)
            404                 {
            405                     currentToken = currentIndex1;
            406                     goto LABEL_SUCCESS_0;
            407                 }
            408                 goto LABEL_FAIL_1;
            409             LABEL_SUCCESS_0: ;
            410                 result = result1;
            411             LABEL_FAIL_1: ;
            412             }
            413             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.Expression>();
            414             return result;
            415         }
            416 
            417         public static CodeBoxControlTest.CodeParser.NumberExpression ParseNumber(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
            418         {
            419             CodeBoxControlTest.CodeParser.NumberExpression result = default(CodeBoxControlTest.CodeParser.NumberExpression);
            420             System.Double NumberMember0 = default(System.Double);
            421             {
            422                 CodeBoxControl.CodeProvider.CodeToken result1 = default(CodeBoxControl.CodeProvider.CodeToken);
            423                 int currentIndex1 = currentToken;
            424                 {
            425                     parseSuccess = false;
            426                     if (currentIndex1 < tokens.Count && tokens[currentIndex1].Id == CodeBoxControlTest.CodeParser.CodeParserTokenizer.NumberToken)
            427                     {
            428                         result1 = tokens[currentIndex1];
            429                         currentIndex1++;
            430                         parseSuccess = true;
            431                     }
            432                 }
            433                 if (parseSuccess)
            434                 {
            435                     currentToken = currentIndex1;
            436                     NumberMember0 = System.Double.Parse(result1.Value);
            437                 }
            438             }
            439             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.NumberExpression>();
            440             result.Number = NumberMember0;
            441             return result;
            442         }
            443 
            444         public static CodeBoxControlTest.CodeParser.FunctionExpression ParseFunction(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
            445         {
            446             CodeBoxControlTest.CodeParser.FunctionExpression result = default(CodeBoxControlTest.CodeParser.FunctionExpression);
            447             System.String NameMember0 = default(System.String);
            448             CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression> ParametersMember0 = default(CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression>);
            449             {
            450                 int currentIndexCopy1 = currentToken;
            451                 int currentIndex1 = currentToken;
            452                 {
            453                     System.String NameMember1 = default(System.String);
            454                     {
            455                         CodeBoxControl.CodeProvider.CodeToken result2 = default(CodeBoxControl.CodeProvider.CodeToken);
            456                         int currentIndex2 = currentIndex1;
            457                         {
            458                             parseSuccess = false;
            459                             if (currentIndex2 < tokens.Count && tokens[currentIndex2].Id == CodeBoxControlTest.CodeParser.CodeParserTokenizer.IdToken)
            460                             {
            461                                 result2 = tokens[currentIndex2];
            462                                 currentIndex2++;
            463                                 parseSuccess = true;
            464                             }
            465                         }
            466                         if (parseSuccess)
            467                         {
            468                             currentIndex1 = currentIndex2;
            469                             NameMember1 = result2.Value;
            470                         }
            471                     }
            472                     NameMember0 = NameMember1;
            473                 }
            474                 if (parseSuccess)
            475                 {
            476                     currentIndexCopy1 = currentIndex1;
            477                 }
            478                 else
            479                 {
            480                     goto LABEL_0;
            481                 }
            482                 {
            483                     parseSuccess = false;
            484                     if (currentIndex1 < tokens.Count && tokens[currentIndex1].Value == "(")
            485                     {
            486                         currentIndex1++;
            487                         parseSuccess = true;
            488                     }
            489                 }
            490                 if (parseSuccess)
            491                 {
            492                     currentIndexCopy1 = currentIndex1;
            493                 }
            494                 else
            495                 {
            496                     goto LABEL_0;
            497                 }
            498                 {
            499                     CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression> ParametersMember1 = default(CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression>);
            500                     {
            501                         CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression> result2 = default(CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression>);
            502                         int currentIndex2 = currentIndex1;
            503                         {
            504                             result2 = new CodeBoxControl.CodeProvider.CodeNodeList<CodeBoxControlTest.CodeParser.Expression>();
            505                             {
            506                                 CodeBoxControlTest.CodeParser.Expression result3 = default(CodeBoxControlTest.CodeParser.Expression);
            507                                 int currentIndex3 = currentIndex2;
            508                                 {
            509                                     parseSuccess = false;
            510                                     result3 = ParseExpression(tokens, ref currentIndex3, ref parseSuccess);
            511                                 }
            512                                 if (parseSuccess)
            513                                 {
            514                                     currentIndex2 = currentIndex3;
            515                                     result2.Add(result3);
            516                                 }
            517                                 while (true)
            518                                 {
            519                                     int currentIndexCopy3 = currentIndex2;
            520                                     {
            521                                         parseSuccess = false;
            522                                         if (currentIndex3 < tokens.Count && tokens[currentIndex3].Value == ",")
            523                                         {
            524                                             currentIndex3++;
            525                                             parseSuccess = true;
            526                                         }
            527                                     }
            528                                     if (parseSuccess)
            529                                     {
            530                                         currentIndexCopy3 = currentIndex3;
            531                                     }
            532                                     else
            533                                     {
            534                                         goto LABEL_1;
            535                                     }
            536                                     {
            537                                         parseSuccess = false;
            538                                         result3 = ParseExpression(tokens, ref currentIndex3, ref parseSuccess);
            539                                     }
            540                                     if (parseSuccess)
            541                                     {
            542                                         currentIndexCopy3 = currentIndex3;
            543                                     }
            544                                     else
            545                                     {
            546                                         goto LABEL_1;
            547                                     }
            548                                     currentIndex2 = currentIndexCopy3;
            549                                     result2.Add(result3);
            550                                 }
            551                             LABEL_1: ; parseSuccess = true;
            552                             }
            553                         }
            554                         if (parseSuccess)
            555                         {
            556                             currentIndex1 = currentIndex2;
            557                             ParametersMember1 = result2;
            558                         }
            559                     }
            560                     ParametersMember0 = ParametersMember1;
            561                 }
            562                 if (parseSuccess)
            563                 {
            564                     currentIndexCopy1 = currentIndex1;
            565                 }
            566                 else
            567                 {
            568                     goto LABEL_0;
            569                 }
            570                 {
            571                     parseSuccess = false;
            572                     if (currentIndex1 < tokens.Count && tokens[currentIndex1].Value == ")")
            573                     {
            574                         currentIndex1++;
            575                         parseSuccess = true;
            576                     }
            577                 }
            578                 if (parseSuccess)
            579                 {
            580                     currentIndexCopy1 = currentIndex1;
            581                 }
            582                 else
            583                 {
            584                     goto LABEL_0;
            585                 }
            586                 currentToken = currentIndexCopy1;
            587             LABEL_0: ;
            588             }
            589             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.FunctionExpression>();
            590             result.Name = NameMember0;
            591             result.Parameters = ParametersMember0;
            592             return result;
            593         }
            594 
            595         public static CodeBoxControlTest.CodeParser.Expression ParseBracket(List<CodeToken> tokens, ref int currentToken, ref bool parseSuccess)
            596         {
            597             CodeBoxControlTest.CodeParser.Expression result = default(CodeBoxControlTest.CodeParser.Expression);
            598             {
            599                 CodeBoxControlTest.CodeParser.Expression result1 = default(CodeBoxControlTest.CodeParser.Expression);
            600                 int currentIndexCopy1 = currentToken;
            601                 int currentIndex1 = currentToken;
            602                 {
            603                     parseSuccess = false;
            604                     if (currentIndex1 < tokens.Count && tokens[currentIndex1].Value == "(")
            605                     {
            606                         currentIndex1++;
            607                         parseSuccess = true;
            608                     }
            609                 }
            610                 if (parseSuccess)
            611                 {
            612                     currentIndexCopy1 = currentIndex1;
            613                 }
            614                 else
            615                 {
            616                     goto LABEL_0;
            617                 }
            618                 {
            619                     {
            620                         CodeBoxControlTest.CodeParser.Expression result2 = default(CodeBoxControlTest.CodeParser.Expression);
            621                         int currentIndex2 = currentIndex1;
            622                         {
            623                             parseSuccess = false;
            624                             result2 = ParseExpression(tokens, ref currentIndex2, ref parseSuccess);
            625                         }
            626                         if (parseSuccess)
            627                         {
            628                             currentIndex1 = currentIndex2;
            629                             result1 = result2;
            630                         }
            631                     }
            632                 }
            633                 if (parseSuccess)
            634                 {
            635                     currentIndexCopy1 = currentIndex1;
            636                 }
            637                 else
            638                 {
            639                     goto LABEL_0;
            640                 }
            641                 {
            642                     parseSuccess = false;
            643                     if (currentIndex1 < tokens.Count && tokens[currentIndex1].Value == ")")
            644                     {
            645                         currentIndex1++;
            646                         parseSuccess = true;
            647                     }
            648                 }
            649                 if (parseSuccess)
            650                 {
            651                     currentIndexCopy1 = currentIndex1;
            652                 }
            653                 else
            654                 {
            655                     goto LABEL_0;
            656                 }
            657                 currentToken = currentIndexCopy1;
            658                 result = result1;
            659             LABEL_0: ;
            660             }
            661             if (result == null) result = CodeNode.Create<CodeBoxControlTest.CodeParser.Expression>();
            662             return result;
            663         }
            664 
            665     }
            666 }
            667 

                果然自動生成的代碼都是很不能看的呢……
            posted on 2010-10-17 01:51 陳梓瀚(vczh) 閱讀(5548) 評論(4)  編輯 收藏 引用 所屬分類: 開發自己的IDE

            評論:
            # re: 開發自己的IDE(七) 2010-10-17 05:23 | mm
            好強大!!!  回復  更多評論
              
            # re: 開發自己的IDE(七)[未登錄] 2010-10-17 17:57 | dd
            太長的生成的代碼,就折疊了不要展開了吧?  回復  更多評論
              
            # re: 開發自己的IDE(七) 2010-10-17 18:20 | 陳梓瀚(vczh)
            @dd
            反正鼠標有滾輪,就麻煩自己滾一下哈。  回復  更多評論
              
            # re: 開發自己的IDE(七)[未登錄] 2010-10-17 18:47 | ccsdu2009
            人才 贊就一個字  回復  更多評論
              
            久久久久久久女国产乱让韩| 欧美久久一级内射wwwwww.| 久久国产精品99精品国产| 国内精品久久久久| 国内精品久久久久久麻豆 | 久久婷婷国产麻豆91天堂| 亚洲国产成人久久综合一| 久久久久国产视频电影| 久久精品免费一区二区| 久久ZYZ资源站无码中文动漫| 99久久精品免费看国产| 麻豆久久| 久久国产精品国产自线拍免费| 久久国产免费| 欧美va久久久噜噜噜久久| 色偷偷888欧美精品久久久| 久久无码一区二区三区少妇| 久久亚洲精品无码AV红樱桃| 韩国三级中文字幕hd久久精品 | 丁香五月网久久综合| 久久久久99精品成人片| 亚洲国产精品18久久久久久| 99久久国产综合精品网成人影院| 国产免费久久精品99re丫y| 国产精品九九九久久九九| 亚洲国产高清精品线久久| 狠狠狠色丁香婷婷综合久久俺| 久久一区二区三区免费| 国产精品久久久久久吹潮| 久久这里有精品| 99久久精品免费观看国产| 久久亚洲精品国产精品| 久久这里都是精品| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久天堂AV综合合色蜜桃网| 欧美性猛交xxxx免费看久久久| 久久久精品免费国产四虎| 中文无码久久精品| 久久中文字幕精品| 久久综合九色欧美综合狠狠| 久久久久免费精品国产 |