Script Interpreter

JScript(javascript) / VBScriptインタープリターを作ってみた。
cscript/wscriptがそれだろ、という声が聞こえてきそうだけど、対話的に実行するアプリケーション、ということ。
対話的に実行といっても、evalするだけだけど。


UIは、HTAにした。(ということで、ただのHTMLなり)
考えるのが面倒だったので。



ソース

<html>
<head>
<title>script interpreter</title>
<style type="text/css">
<!--
.source {
	width=100%;
	height=30%;
}
-->
</style>
<script type="text/javascript">
<!--
function checkKey() {
	var src = source.innerText
	if(event.keyCode == 13 && src.length > 0 && src.charCodeAt(src.length - 1) == 32) {
		var re = new RegExp("(([ \\t\\f\\v]*[^\\s].*\\r\\n)+) (?!.)", "m");
		if(re.test(src)) {
			source.innerText = src.substr(0, src.length - 1);
			src = RegExp.$1;
			if(language.value == "js") {
				run(src);
			} else {
				runVbs(src);
			}
		}
	}
}
var _auto = true;
function run(src) {
	if(_auto) result.innerText = "";
	eval(src);
}
function setAutoClear(flg) {
	_auto = flg;
}
function getAutoClear() {
	return _auto;
}
function print(msg) {
	result.innerText += String.fromCharCode(13, 10) + msg;
}
//-->
</script>
<script type="text/vbscript">
<!--
Function runVbs(src)
	If getAutoClear() Then result.innerText = ""
	Execute src
End Function
'-->
</script>
</head>

<body>
Source: ( space & enter ) 
<select id="language">
	<option value="js">JavaScript
	<option value="vbs">VBScript
</select>
<br>
<textarea id="source" class="source" onkeypress="checkKey()">
var fso = new ActiveXObject("Scripting.FileSystemObject");
for(attr in fso) {
	print(attr);
}
var f = fso.OpenTextFile(document.URL.substr(7));
print(f.ReadAll());
f = null;
fso = null;
</textarea><br>
<br>
Result: ( use print(msg) )<br>
<div id="result"></div>
</body>
</html>


textareaに入力して、最後にスペース&エンターする(ようは半角スペース1個の行を書く)と、実行します。
初期表示は、自身を読み込むスクリプト
最後の空行から半角スペース1個の行までをevalして、最後の半角スペースを消すので、実行後続けてスクリプトが書けます。
おまけで、VBScriptの実行もつけた。
コンボボックスからVBScriptを選ぶと、VBScriptとして実行します。


スクリプトを書く時に、何気に便利。


varすると、ローカルになるみたいで、グローバルにしたければ、varしなければ良いみたい。
evalの変数スコープがあるのでしょう、多分。


なお、VBScriptの実行は、scriptタグを利用して行っています。
ScriptControlは使ってません。
ScriptControlは32bitでないと呼び出せないので、そこんとこよろしく。
(64bit Powershell/wscript/cscript/InternetExplorerでエラー確認。
 32bit Powershell/wscript/cscript/InternetExplorerで動作確認)