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

            升C小調(diào)狂想曲

            <遞歸的憂傷>
            posts - 10, comments - 71, trackbacks - 0, articles - 0
               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            要寫一個(gè)腳本引擎,首先要明確腳本長什么樣,具備哪些功能,需要有怎樣的能力。
            Since昨天我說第一版是面向過程,強(qiáng)類型,無閉包,無自定義結(jié)構(gòu),支持?jǐn)?shù)組,那么我將腳本設(shè)計(jì)如下:

            CNScript 0.1 Draft

             

            Functionality:

            Procedure Oriented, No Custom Data Structures, No Closures, Strong Typed, Array Supported.

             

            Keywords:

            int,double,char,string,bool,void,if,else,for,do,while,return

             

            Statements:

            Single Expression:

            expression;

             

            Chunk:

            {

                     Statement1

                     Statement2

            }

             

            Array Declaration:

            type name[size];

             

            Variable Declaration:

            type name [= expression];

             

            Function definition:

            type FunctionName(type paramName1, type paramName2)

            Chunk

             

            IF-ELSE:

            if(expression)

            Statement1

            else

            Statement2

             

            FOR-LOOP:

            for(statement1 expression2;expression3)

            Statement

             

            WHILE-LOOP:

            while(expression)

            Statement

             

            DO-WHILE-LOOP:

            do

            Statement                                              

            while(expression);

             

            Expressions:

                     Values:

                               true

                               false

                               number

                               string

                               char

                               Variable Name

                               Array Name[index]

             

                     Assign:

                     name = expression

             

                     Function Call:

                     name(expression1,expression2)

             

                     Compares:

                               expression1 == expression2

                               expression1 != expression2

                               expression1 < expression2

                               expression1 > expression2

                               expression1 <= expression2

                               expression1 >= expression2

             

                     Boolean Operations:

                               !expression

                               expression1 && expression2

                               expression1 || expression2

             

                     Calculating:

                               expression++

                               expression

                               ++expression

                               --expression

                               expression1 + expression2

                               expression1expression2

                               expression1 * expression2

                               expression1 / expression2

                               expression1 % expression2

                               expression1 ^ expression2

                               (expression)

             

            Lexical Tokens:

            Spaces:

                     Space:                         (space_bar+)|(\n+) (\r+)|(\t+)

            TypeNames:

                     Type:                           (int)|(double)|(char)|(string)|(bool)|(void)

            Keywords:

                     Keyword_if:               if

                     Keyword_else:          else

                     Keyword_for:            for

                     Keyword_do:             do

                     Keyword_while:       while

                     Keyword_return:     return

            Brackets:

                     BigLeftBracket:        {

                     BigRightBracket:     }

                     MidLeftBracket:       [

                     MidRightBracket:    ]

                     SmallLeftBracket:    \(

                     SmallRightBracket: \)

            Identifier:

                     Identifier:                  (_+[a-zA-Z0-9_]+)|([a-zA-Z][a-zA-Z0-9_]*)

            Number Value:

                     Integer:                      0|[1-9][0-9]*

                     Double:                       (0|[1-9][0-9]*)\.[0-9]+

            Bool Value:

                     BoolValue:                 true|false

            Char:

                     CharValue:                 ‘(\\[^\r\n\t])|([^’\r\n\t])’

            String:

                     StringValue:               “((\\”)|[^\r\n])*”                                                                                       

            Operators:

                     Operator:                    =|\+|-|\*|/|%|^|(++)|(--)|(&&)|(\|\|)|(!)|<|>|(<=)|(>=)|(==)|(!=)

            Seprators:

                     Seprator:                    ;

             

            以上就是腳本設(shè)計(jì)初稿,如果后面發(fā)現(xiàn)有錯(cuò)誤,會去更正的。

            按這個(gè)設(shè)計(jì),寫出來的程序大概是下面這樣:

             1 int Foo(int value)
             2 {
             3    return value;
             4 }
             5 
             6 void main()
             7 {
             8    int a = 100;
             9    for(int i=0;i<100;i++)
            10    {
            11       --a;
            12    }
            13    if(a>0)
            14    {
            15       Foo(a);
            16    }
            17 }


            基本上就是個(gè)沒模板,沒類,沒指針的C++了。

            設(shè)計(jì)就這樣了,明天開始寫詞法分析喔!上面的Lexical Tokens就是給詞法分析用的,因?yàn)榇a是字符串,我們先要把整個(gè)字符串讀成一個(gè)一個(gè)的Token,才方便進(jìn)行語法分析和更深入的處理,比如
            int a = 100;
            要先拆成[type:int] [space] [identifier:a] [space] [operator:=] [space] [integer:100] [seperator:;]
            這個(gè)過程就是詞法分析了。

            詞法分析完了得出這些Tokens然后再匹配到

            Variable Declaration:

            type name [= expression];

            才能建立起語法樹來。
            Lexical Tokens中是每種Token對應(yīng)的正則表達(dá)式。

            Feedback

            # re: 繪制藍(lán)圖 --- CNScript 成長日記(2)  回復(fù)  更多評論   

            2008-08-06 07:07 by foxtail
            恩 非常有參考價(jià)值

            # re: 繪制藍(lán)圖 --- CNScript 成長日記(2)[未登錄]  回復(fù)  更多評論   

            2008-08-06 17:46 by ngaut
            @foxtail
            c-like的,設(shè)計(jì)目標(biāo)和inger基本一致:) 不錯(cuò),期待下一篇,
            亚洲精品无码久久久久去q| 国内精品久久久久久99| 久久99精品久久久久久动态图| 久久播电影网| 精品久久久久中文字| 亚洲国产精品久久66| 91久久婷婷国产综合精品青草 | 国内精品伊人久久久久| 亚洲女久久久噜噜噜熟女| 国产精品久久婷婷六月丁香| 国产欧美久久久精品影院| 亚洲国产综合久久天堂| 亚洲精品无码久久毛片| 久久久久久久女国产乱让韩| 欧美精品乱码99久久蜜桃| 久久精品国产色蜜蜜麻豆| 亚洲国产精品无码久久| 国产精品女同久久久久电影院| 97精品国产91久久久久久| 蜜桃麻豆www久久| 成人a毛片久久免费播放| 久久久久国产日韩精品网站| 国产精品久久久久久五月尺| 久久精品亚洲日本波多野结衣 | 无码人妻久久一区二区三区蜜桃 | 国产激情久久久久久熟女老人| 日产精品久久久久久久| 久久最近最新中文字幕大全| 人人狠狠综合久久亚洲高清| 亚洲国产视频久久| 国产成人精品久久免费动漫| 久久精品国产亚洲精品| 久久久久久久久久久| 99久久综合国产精品二区| 久久SE精品一区二区| 国产精品免费久久久久影院| 国产精品久久婷婷六月丁香| 91精品国产91久久久久久青草| 久久夜色精品国产噜噜亚洲a | 亚洲精品tv久久久久久久久久| 久久一日本道色综合久久|