趁有假期,用js實現了一套js的詞法分析器、語法分析器、編譯器、解譯器,以及一個很
簡單的ide,自己實現了函數和閉包。另外寫了中文化的詞法分析器語法分析器,實現了一
個我比較滿意的中文編程語言。
http://code.google.com/p/chn-js/
------------------------------
中文編程語言規格(實例方式):
+ - * / ^ & | ~ = 等等
可考慮:== -> =? 如 1 =? 2 比較表達式一例改為 >? <? <=? <=?(未按此實現)
變量聲明
元 a = expr
函數聲明
函數名(參數, 參數) :: [[ 代碼段 ]]
函數名(參數, 參數) ::
[[
代碼段
]]
匿名函數
數組#排序(_(參數1, 參數2) :: [[返回 參數1 - 參數2;]])
屬性引用
對象#屬性
對象#方法(參數,參數)
對象直接量
元 o = [[屬性: 值1, 屬性2 : 值2, 屬性3 : 值3]];
元 o = [[
屬性: 值1,
屬性2 : 值2,
屬性3 : 值3
]];
元 o = [[:]];
o#屬性
數組直接量
元 o = [[值1,值2,值3]];
數組下標
數組#[1]
返回語句
返回;
返回 1;
返回 [[屬性: 值, 屬性2 : 值2, 屬性3 : 值3]];
拋錯
拋出 [[屬性: 值, 屬性2 : 值2, 屬性3 : 值3]];
拋出 新 錯誤("變量 a 未定義");
判斷
如果 a == 1 [[ // 後面必須接語句塊,即:不允許 if(cond) aa; 必須是 if cond {aa;}
dadada
]] 否則 [[
dididi
]]
循環
如果 a == 1 反復[[
dadada
]]
反復[[
dadada
]]如果 a == 1;
break
跳出
continue
繼續
標籤語句:
標籤 回收資源 :: // js 的標籤 a : 在語句塊 { } 中易與對象立即值混淆,存在歧義
分支
如果 a [[ // 不使用 ==,避免和 == 衝突
為 1 :
xxx;
跳出;
為 2:
yyy;
跳出;
其它:
zzz;
]]
循環
令 a = 1; a < 10; a ++ [[
zzz;
]]
所有 a 屬於 o[[
zzz;
]]
in
屬於
instanceof
是
try
執行[[
xxx;
]] 抓錯 e [[
yyy;
]] 最終 [[
zzz;
]]
-----------------------------------
測試代碼:
// ----------------------- 構造函數 ------------------------
人() :: [[
我#姓名 = '張三';
我#年齡 = 22;
我#說 = _() :: [[
console#log('大家好,我叫' + 我#姓名 + “,我今年” + 我#年齡
+'歲了');
]]
]]
元 張三 = 新 人();
張三#說();
log(張三#姓名);
//----------------------- 囘調排序 ----------------------------
元 a = [[4, 6, 7, 2, 1, 3]];
a#sort(_(a, b)::[[
返回 a - b;
]]);
log(a);
// ---------------------- cons ------------------------
cons(a, b) ::[[
返回 _(o) :: [[
如果 o == 1 [[ 返回 a; ]] 否則 [[返回 b;]]
]]
]]
car(o) :: [[返回 o(1);]]
cdr(o) :: [[返回 o(2);]]
元 s = cons(7, 8);
log(car(s));
log(cdr(s));
黏合(一, 二) ::[[
返回 _(機關) :: [[
如果 機關 == 1 [[ 返回 一; ]] 否則 [[返回 二;]]
]]
]]
取頭(分子) :: [[返回 分子(1);]]
取尾(分子) :: [[返回 分子(2);]]
元 小 = 黏合(7, 8);
log(取頭(小));
log(取尾(小));
// ======================
人() :: [[
我#姓名 = '張三';
我#年齡 = 22;
我#說 = _(urname) :: [[
console#log(urname +',你好,我叫' + 我#姓名 + “,我今年” + 我
#年齡 +'歲了');
返回 2;
]]
]]
元 張三 = [[:]];
人#apply(張三, [[]]);
元 s = 張三#說#call(張三, '王三');
元 s = 張三#說#apply(張三, [['王三']]);
log(s);
// --------------------------------- prototype & instanceof -------------------
----
人() :: [[
我#姓名 = '張三';
]]
人#prototype#說 = _()::[[
log('你好,我是' + 我#姓名);
]];
男人() :: [[
]]
男人#prototype = 新 人();
男人#prototype#說 = _() ::[[
log('你好,我是' + 我#姓名 + '先生');
]];
元 a = 新 男人();
log(a 是 男人);
log(a 是 人);
log(a 是 Object);
//------------------------- 閉包 ------------------------
f(a) :: [[
返回 _()::[[ 返回 a; ]]
]]
元 a1 = f(1);
元 a2 = f(2);
a1() + a2()
//---------------------- 數組 --------------------------
// 測試 this.數組 是否被常量化
人() :: [[
我#喜歡的人 = [[]];
我#姓名 = '張三';
]]
元 p1 = 新 人();
元 p2 = 新 人();
p1#姓名 = '李世民';
p1#喜歡的人#push('程咬金');
log(p2#姓名);
log(p2#喜歡的人);
-------------------
enjoy it~~
簡單的ide,自己實現了函數和閉包。另外寫了中文化的詞法分析器語法分析器,實現了一
個我比較滿意的中文編程語言。
http://code.google.com/p/chn-js/
------------------------------
中文編程語言規格(實例方式):
+ - * / ^ & | ~ = 等等
可考慮:== -> =? 如 1 =? 2 比較表達式一例改為 >? <? <=? <=?(未按此實現)
變量聲明
元 a = expr
函數聲明
函數名(參數, 參數) :: [[ 代碼段 ]]
函數名(參數, 參數) ::
[[
代碼段
]]
匿名函數
數組#排序(_(參數1, 參數2) :: [[返回 參數1 - 參數2;]])
屬性引用
對象#屬性
對象#方法(參數,參數)
對象直接量
元 o = [[屬性: 值1, 屬性2 : 值2, 屬性3 : 值3]];
元 o = [[
屬性: 值1,
屬性2 : 值2,
屬性3 : 值3
]];
元 o = [[:]];
o#屬性
數組直接量
元 o = [[值1,值2,值3]];
數組下標
數組#[1]
返回語句
返回;
返回 1;
返回 [[屬性: 值, 屬性2 : 值2, 屬性3 : 值3]];
拋錯
拋出 [[屬性: 值, 屬性2 : 值2, 屬性3 : 值3]];
拋出 新 錯誤("變量 a 未定義");
判斷
如果 a == 1 [[ // 後面必須接語句塊,即:不允許 if(cond) aa; 必須是 if cond {aa;}
dadada
]] 否則 [[
dididi
]]
循環
如果 a == 1 反復[[
dadada
]]
反復[[
dadada
]]如果 a == 1;
break
跳出
continue
繼續
標籤語句:
標籤 回收資源 :: // js 的標籤 a : 在語句塊 { } 中易與對象立即值混淆,存在歧義
分支
如果 a [[ // 不使用 ==,避免和 == 衝突
為 1 :
xxx;
跳出;
為 2:
yyy;
跳出;
其它:
zzz;
]]
循環
令 a = 1; a < 10; a ++ [[
zzz;
]]
所有 a 屬於 o[[
zzz;
]]
in
屬於
instanceof
是
try
執行[[
xxx;
]] 抓錯 e [[
yyy;
]] 最終 [[
zzz;
]]
-----------------------------------
測試代碼:
// ----------------------- 構造函數 ------------------------
人() :: [[
我#姓名 = '張三';
我#年齡 = 22;
我#說 = _() :: [[
console#log('大家好,我叫' + 我#姓名 + “,我今年” + 我#年齡
+'歲了');
]]
]]
元 張三 = 新 人();
張三#說();
log(張三#姓名);
//----------------------- 囘調排序 ----------------------------
元 a = [[4, 6, 7, 2, 1, 3]];
a#sort(_(a, b)::[[
返回 a - b;
]]);
log(a);
// ---------------------- cons ------------------------
cons(a, b) ::[[
返回 _(o) :: [[
如果 o == 1 [[ 返回 a; ]] 否則 [[返回 b;]]
]]
]]
car(o) :: [[返回 o(1);]]
cdr(o) :: [[返回 o(2);]]
元 s = cons(7, 8);
log(car(s));
log(cdr(s));
黏合(一, 二) ::[[
返回 _(機關) :: [[
如果 機關 == 1 [[ 返回 一; ]] 否則 [[返回 二;]]
]]
]]
取頭(分子) :: [[返回 分子(1);]]
取尾(分子) :: [[返回 分子(2);]]
元 小 = 黏合(7, 8);
log(取頭(小));
log(取尾(小));
// ======================
人() :: [[
我#姓名 = '張三';
我#年齡 = 22;
我#說 = _(urname) :: [[
console#log(urname +',你好,我叫' + 我#姓名 + “,我今年” + 我
#年齡 +'歲了');
返回 2;
]]
]]
元 張三 = [[:]];
人#apply(張三, [[]]);
元 s = 張三#說#call(張三, '王三');
元 s = 張三#說#apply(張三, [['王三']]);
log(s);
// --------------------------------- prototype & instanceof -------------------
----
人() :: [[
我#姓名 = '張三';
]]
人#prototype#說 = _()::[[
log('你好,我是' + 我#姓名);
]];
男人() :: [[
]]
男人#prototype = 新 人();
男人#prototype#說 = _() ::[[
log('你好,我是' + 我#姓名 + '先生');
]];
元 a = 新 男人();
log(a 是 男人);
log(a 是 人);
log(a 是 Object);
//------------------------- 閉包 ------------------------
f(a) :: [[
返回 _()::[[ 返回 a; ]]
]]
元 a1 = f(1);
元 a2 = f(2);
a1() + a2()
//---------------------- 數組 --------------------------
// 測試 this.數組 是否被常量化
人() :: [[
我#喜歡的人 = [[]];
我#姓名 = '張三';
]]
元 p1 = 新 人();
元 p2 = 新 人();
p1#姓名 = '李世民';
p1#喜歡的人#push('程咬金');
log(p2#姓名);
log(p2#喜歡的人);
-------------------
enjoy it~~