青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

實現一種解釋性腳本語言(二)

author: Kevin Lynx email: zmhn320#163.com date: 3.6.2009

語言特性

    在正式討論實現細節前明確下這個腳本語言的一些語言特性,基本上可以讓我們預見將
來會遇到哪些難題。總的來說,它(腳本)將同我們平時接觸的如lua一樣的腳本語言:擁
有一般的編程語言特性,如變量、各種控制流程、也許還有函數,另一方面它還應該和它的
宿主語言結合,如作為一個庫被用進C,這還涉及到給這門語言設計一種插件方式,最好能
通過獨立的解釋程序讓腳本載入一些插件運行。

    以下在描述我寫的這個腳本語言時,將以kl表示它的名字,以方便描述。

代碼塊:

    首先從整體風格上,kl如同C語言一樣被劃分為函數塊,如:
    function func1()
    {
    }
    function func2()
    {
    }
    ...
    kl支持以{}隔離代碼塊,但是這并不意味著kl有多個獨立的局部堆棧,如同C語言一樣。
這些細節暫不討論。本節描述的所有內容你都不必深究,因為我只要求你對kl有個感性上的
認識。
    函數塊之外沒有可執行的語句(statement)。那么你可能會想到程序的入口點也許會是
main。事實上從kl提供的庫來看,并沒有這種硬性要求。但是,kl的獨立解釋程序是這樣要
求的。   

變量:

    kl允許你在任何地方使用一個變量。變量不需要事先定義,任何地方出現一個合
法的標識符時,就意味著kl內部會增加這個變量,并給予初值。變量也沒有靜態類型,也不
會固定為某一類型。就一門最簡單的語言來看,我覺得數據類型無非就是字符串和數字類型

    所以,kl的變量在某一時刻必然是數字,或者字符串。在腳本里,你無法獲知一個變量
的類型,事實上也沒這個必要。說變量擁有一個類型屬性,倒不如說值(value)有一種類型
屬性。
    當字符串值與數字值參與運算時,如1+"a",其運算結果將自動轉換為字符串,也就是
"1a"。
    一個只有標識符的語句(statement)通常意味著你想定義一個變量。這種無聊的手段通
常被用于定義全局變量。

運算符:

    kl支持一般的C語言風格的算術、比較、邏輯運算符。例如加減乘除、大于小于、邏輯
與邏輯或。

作用域:

    kl腳本里只有兩個作用域:全局的和局部的。
    位于所有函數塊外的變量處于全局作用域;位于函數內的變量處于局部作用域,位于函
數塊內的代碼塊變量,還是處于局部作用域。
    當局部作用域內出現一個全局里的同名變量時,優先取局部作用域里的變量。這同C語
言一樣。

控制語句if:
    if的語法同C語言一樣,如:
    if( a > 10 )
    {
    }
    else
    {
    }
    if( a > 10 )中的a>10被我成為條件語句,所有條件語句,包括下面的while,都不能
為字符串。例如if( "a" )將被視為非法語句。(我為什么要這樣考慮?- -!)

控制語句while:

    c-like while:
    while( a > 10 )
    {
    }
    很遺憾,我暫時沒有加入對for的支持。因為我覺得既然有了while,有了循環控制,在
沒有更多無聊時間的前提下,我沒有必要加入for。

函數:

    很遺憾,函數的定義和調用和C語言有點不一樣。這是因為kl沒有變量類型,那就意味
著函數定義如果和C語言一樣,就會出現語法歧義,如:
    func( a )
    {
    }
    就會和函數調用func(a)出現混淆。所以,我加入了function關鍵字。定義函數的語法
為:
    function func( a, b )
    {
    }
    如你所見,函數支持參數傳遞,當然也支持return a;返回值。kl是簡陋的,因為它沒
有指針之類的概念,所以你無法為函數傳遞一塊數據。當然,kl也不能像lua一樣讓函數可
以返回多個值。
    函數調用的語法相對熟悉:
    func( 1, 3 );

數組:

    從一開始我就沒考慮為kl加入數組。事實證明加入數組是一個不明智的做法。數組的支
持讓代碼在很多地方變得臟亂。無論如何,kl后來支持一維數組了。為了讓代碼保持那么一
點點的干凈,我甚至為定義數組加入dim的關鍵字。這意味著,在kl里,數組和一般的變量
總有點不一樣:變量無需定義,數組卻必須事先定義。
    數組的長度不支持動態擴充。如果支持,我得讓kl內部更好地去管理內存。
    數組元素的類型沒有硬性的規定,這意味著a[0] = 1; a[1] = "a";是允許的。

    語言特性上就描述這些,在本節末尾我決定貼一段kl計算階乘的代碼:

/* fac.kl */
function main()
{
    n = input( "%d" );
    print( "fac(" + n + ") = " + fac( n ) );
}

function fac( n )
{
    if( n == 1 )
    {
        return 1;
    }
    else
    {
        return fac( n - 1 ) * n;
    }
}

posted on 2009-03-06 16:01 Kevin Lynx 閱讀(4746) 評論(9)  編輯 收藏 引用 所屬分類: kl腳本實現編譯原理

評論

# re: 實現一種解釋性腳本語言(二) 2009-03-06 16:31 陳梓瀚(vczh)

類型可以這么處理。假設你要處理operator>,理論上operator>的類型是一個表。譬如說C++語言的話有
<int,int,bool>
<float,float,bool>
<char,char,bool>
......
<int,float,bool>
<float,int,bool>

只要最終匹配到了唯一的一個,那么就能夠得到第三個項也就是operator>的類型了。如果匹配多個有可能是錯誤(譬如函數重載),匹配不到一定是錯誤。  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2009-03-06 16:36 陳梓瀚(vczh)

另外,既然是無類型的,那么我建議你把函數也作為值處理。譬如說
pair=func(a,b)
{
return func(c)
{
return c(a,b);
};
};

first=func(p)
{
return p(func(a,b){return a;});
};

second=func(p)
{
return p(func(a,b){return b;});
};

main=func()
{
p=pair(pair(1,2),pair(3,4));
print(second(first(p)));//輸出3
};  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2009-03-06 16:37 陳梓瀚(vczh)

于是你有了這種叫closure的東西,做垃圾收集器吧。引用計數不行的。  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2009-03-06 18:54 空明流轉

我覺得類型推導是一個以操作符為邊的有向無環圖。  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2009-03-06 21:00 陳梓瀚(vczh)

@空明流轉
你這重要建模成類似int×float ==(operator>)=> bool的才行。工程意義不大。而且沒什么理由無環。  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2011-07-22 00:10 thircese

@Kevin Lynx

"我為什么要這樣考慮"
能否回答下?

"就會和函數調用func(a)出現混淆"
func(a)如果出現在全局范圍,
則是函數定義, 否則,
出現在局部范圍, 就是函數調用.
而且, 函數調用后面還有分號,
而函數定義沒有.
為什么會混淆呢?
  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2011-07-22 09:05 Kevin Lynx

@thircese
大概是因為在全局范圍內也能寫下a = func()這樣的語句。分號雖然能作為區分,但在很簡單的語法分析算法中,是希望由最開頭的token來確定后面跟的是什么樣的語法。在具體實現時:
if (tok == TK_FUNCTION) 就可以簡單地知道是函數定義,而不是在掃描完函數名、參數列表、括號后發現還有分號,才能確定是函數調用,這多少會加大實現的復雜度  回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2011-07-22 14:13 plagiarism detection

Writing your academic assignments usually utilize plagiarism detector. It can save your good name!   回復  更多評論   

# re: 實現一種解釋性腳本語言(二) 2011-07-22 16:43 thircese

@Kevin Lynx
原來是為了簡單.  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合电影| 亚洲欧美日韩第一区| 国产精品久久久久久超碰 | 亚洲美女黄色片| 久久亚洲风情| 亚洲国产精品一区二区久| 正在播放亚洲| 欧美日韩国产一区二区| 亚洲精品视频一区二区三区| 久久综合色影院| 久久精品欧洲| 一区精品在线| 欧美不卡三区| 欧美顶级大胆免费视频| 亚洲国产精品va在线看黑人动漫| 欧美在线观看网址综合| 亚洲一区国产| 国产欧美短视频| 国产欧美一区二区精品性| 欧美在线观看一二区| 国产精品99久久久久久www| 欧美偷拍另类| 性欧美大战久久久久久久免费观看| 99re6这里只有精品视频在线观看| 欧美精品久久一区| 一区二区毛片| 亚洲一区二区三区在线看| 欧美系列电影免费观看| 亚洲性视频网站| 亚洲一区激情| 国产亚洲一区二区三区在线播放| 久久精品1区| 久久亚洲风情| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲欧美综合国产精品一区| 91久久久亚洲精品| 欧美日韩一区成人| 亚洲一区二区三区在线看 | 欧美精品乱码久久久久久按摩| 一区二区三区在线视频免费观看 | 久久精品国产96久久久香蕉| 久久夜色精品国产| 国产综合自拍| 免费看黄裸体一级大秀欧美| 久久综合九色九九| 国模一区二区三区| 欧美国产激情二区三区| 欧美激情影音先锋| 久久亚洲欧美| 亚洲动漫精品| 欧美午夜不卡视频| 久久久视频精品| 久久久久久久成人| 一区二区免费看| 欧美电影免费观看大全| 免费黄网站欧美| 亚洲欧美中文另类| 9久re热视频在线精品| 久久深夜福利免费观看| 欧美日韩一区在线播放| 亚洲丶国产丶欧美一区二区三区| 99re热这里只有精品免费视频| 久久天天躁狠狠躁夜夜av| 雨宫琴音一区二区在线| 亚洲大片免费看| 欧美视频亚洲视频| 久久影视三级福利片| 欧美精品色综合| 久久精品1区| 亚洲在线黄色| 亚洲东热激情| 亚洲一区二区三区涩| 午夜影视日本亚洲欧洲精品| 这里是久久伊人| 亚洲一区二区成人| 亚洲综合日韩在线| 午夜在线精品偷拍| 欧美成人精品h版在线观看| 国产有码在线一区二区视频| 美女福利精品视频| 欧美视频一区二区三区| 久久九九免费视频| 欧美日韩精品在线| 久久综合图片| 国产一区视频在线观看免费| 亚洲精品美女在线观看| 亚洲人成网在线播放| 性欧美1819sex性高清| 欧美一二三视频| 欧美美女视频| 欧美jjzz| 激情小说另类小说亚洲欧美| 亚洲高清不卡av| 亚洲高清不卡| 久久裸体视频| 欧美在线高清| 欧美在线观看www| 亚洲影院在线观看| 欧美黄色aa电影| 日韩视频一区二区三区在线播放| 亚洲第一在线综合在线| 裸体歌舞表演一区二区| 欧美mv日韩mv国产网站app| 91久久精品日日躁夜夜躁欧美| 亚洲高清不卡| 国产日韩精品一区二区| 欧美国产精品日韩| 99精品国产一区二区青青牛奶| 久久久免费精品视频| 欧美风情在线观看| 久久av红桃一区二区小说| 亚洲日本激情| 亚洲国产99| 亚洲盗摄视频| 亚洲永久视频| 亚洲精品国精品久久99热| 久久不射中文字幕| 一区二区三区四区精品| 亚洲黄页视频免费观看| 一区在线视频| 亚洲高清视频一区二区| 国产在线国偷精品产拍免费yy| 亚洲欧美另类国产| 久久久久国内| 国产精品视频网址| 一本久久综合亚洲鲁鲁| 久久国产精品72免费观看| 性欧美超级视频| 国产欧美精品一区| 欧美一级欧美一级在线播放| 久久久精品tv| 亚洲人久久久| 欧美午夜视频在线| 99视频在线观看一区三区| 一区二区三区国产盗摄| 欧美视频亚洲视频| 亚洲一区二区三区在线看| 午夜在线播放视频欧美| 国产香蕉97碰碰久久人人| 久久久久网址| 亚洲免费观看视频| 欧美综合国产| 亚洲欧洲精品一区| 国产精品高潮呻吟| 久久婷婷国产综合尤物精品| 亚洲人成欧美中文字幕| 亚洲一区二区视频| 激情欧美日韩| 欧美日韩国产成人高清视频| 亚洲视频综合在线| 久久精品亚洲乱码伦伦中文| 亚洲黄色三级| 国产精品永久免费| 久久久精品国产一区二区三区| 欧美激情视频免费观看| 亚洲一级在线观看| 亚洲第一成人在线| 欧美性片在线观看| 欧美午夜精品久久久久久孕妇| 亚洲视频在线看| 红桃av永久久久| 欧美系列一区| 久久gogo国模裸体人体| 欧美大片免费看| 久久成人亚洲| 一本色道久久综合亚洲精品不 | 亚洲人妖在线| 久久久久久久久岛国免费| 日韩午夜激情| 国内外成人免费激情在线视频网站 | 亚洲国产经典视频| 欧美第一黄色网| 亚洲精品乱码久久久久久黑人| 亚洲国产成人tv| 亚洲欧美国产精品桃花| 亚洲三级电影全部在线观看高清| 久久精品国产99国产精品| 中文精品99久久国产香蕉| 亚洲电影成人| 国产视频一区在线观看一区免费| 欧美精品在线观看| 免费亚洲电影在线| 久久精品人人爽| 免费观看成人| 久久一区二区三区超碰国产精品| 久久视频在线看| 欧美怡红院视频| 久久欧美中文字幕| 久久福利精品| 久久综合狠狠综合久久综合88| 欧美一区二区三区在线视频| 久久影院午夜论| 久久久五月婷婷| 欧美大片在线影院| 欧美91精品| 国产精品xxx在线观看www| 欧美视频在线免费看| 国产欧美精品一区二区色综合| 国产精品免费网站| 怡红院精品视频在线观看极品|