前文 "JavaScript實現ZLOGO子集: 前進+轉向" 的示例代碼很累贅, 因此嘗試實現基本的迴圈功能, 使得前面的11行代碼縮減為7行: 源碼和線上演示地址同前文. 修改的語法描述(圈3.g4)不多, 應該已經支持多層迴圈: 但實現上, 暫時先做了單層. 就是將迴圈體內的指令存放起來, 在 ...
前文JavaScript實現ZLOGO子集: 前進+轉向的示例代碼很累贅, 因此嘗試實現基本的迴圈功能, 使得前面的11行代碼縮減為7行:
開始
迴圈4次
前進200
左轉144度
到此為止
前進200
結束
源碼和線上演示地址同前文.
修改的語法描述(圈3.g4)不多, 應該已經支持多層迴圈:
聲明 : 前進 | 轉向 | 迴圈;
迴圈 : '迴圈' T數 '次' 聲明+ '到此為止' ;
但實現上, 暫時先做了單層. 就是將迴圈體內的指令存放起來, 在迴圈結束時, 把它們按迴圈次數重覆添加到最終的指令序列中:
// TODO: 支持多層迴圈
var 迴圈次數 = 0;
var 當前迴圈的指令序列 = [];
...
定製監聽器.prototype.enter迴圈 = function(上下文) {
迴圈次數 = parseInt(上下文.getChild(1).getText());
}
定製監聽器.prototype.exit迴圈 = function(上下文) {
for (var i = 0; i < 迴圈次數; i++) {
for (var j = 0; j < 當前迴圈的指令序列.length; j++) {
指令序列.push(當前迴圈的指令序列[j]);
}
}
當前迴圈的指令序列 = [];
迴圈次數 = 0;
}
定製監聽器.prototype.exit前進 = function(上下文) {
...
添加指令({名稱: 常量_指令名_前進, 參數: parseInt(前進量)});
};
定製監聽器.prototype.exit轉向 = function(上下文) {
...
添加指令({名稱: 常量_指令名_轉向, 參數: 角度});
};
function 添加指令(指令) {
if (迴圈次數 > 0) {
當前迴圈的指令序列.push(指令);
} else {
指令序列.push(指令);
}
}
在實現多層迴圈之前, 打算先添加測試用例. 畢竟手動測試已經開始麻煩了.