用JS寫了一個中文化的JS

来源:岁月联盟 编辑:exp 时间:2012-10-25

趁有假期,用js實現了一套js的詞法分析器、語法分析器、編譯器、解譯器,以及一個很
簡單的ide,自己實現了函數和閉包。另外寫了中文化的詞法分析器語法分析器,實現了一
個我比較滿意的中文編程語言。

------------------------------

中文編程語言規格(實例方式):

+ - * / ^ & | ~ = 等等
    可考慮:== -> =?   如  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~~