-
-
Save connerbrooks/10003464 to your computer and use it in GitHub Desktop.
[wearscript] voicescript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html style="width:100%; height:100%; overflow:hidden"> | |
<head> | |
<!-- You can include external scripts here like so... --> | |
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/zepto/1.0/zepto.min.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>--> | |
</head> | |
<body style="width:100%; height:100%; overflow:hidden; margin:0"> | |
<canvas id="canvas" width="640" height="360" style="display:block"></canvas> | |
<script> | |
var progNum = 0; | |
var tree; | |
var programTree = new WS.Cards(); | |
var programs = []; | |
var dbg = 0; | |
var token; | |
var tokens; | |
var tokenPtr = 0; | |
function getNextToken() { | |
token = tokens[tokenPtr++]; | |
} | |
function runParser(data) { | |
// Split the data into tokens | |
tokens = data.split(' '); | |
tokenPtr = 0; | |
getNextToken(); | |
return expr(); | |
} | |
var errorCode = 0; | |
var errors = { IdExpected:1, DoExpected:2, ThenExpected:3, ArgumentsExpected:4, BodyExpected:5, EndExpected:6 }; | |
function error(code, pos) { | |
var ErrMsg = getError(code, pos); | |
WS.log(ErrMsg); | |
} | |
function getError(code, pos) { | |
switch (code) { | |
case errors.IdExpected: | |
return 'Expected an identifier. Received: ' + token + ' at ' + tokenPtr; | |
case errors.DoExpected: | |
return 'Expected \'do\' in \'while\' definition. Received: ' + token + ' at ' + tokenPtr; | |
case errors.ThenExpected: | |
return 'Expected \'then\' in \'if\' definition. Received: ' + token + ' at ' + tokenPtr; | |
case errors.ArgumentsExpected: | |
return 'Expected the keyword \'arguments\' whne using a function. Received: ' + token + ' at ' + tokenPtr; | |
case errors.BodyExpected: | |
return 'Expected the \'body\' keyword when defining a function. Received: ' + token + ' at ' + tokenPtr; | |
case errors.EndExpected: | |
return 'Expected a matching \'end\' to \'begin\'. Received: ' + token + ' at ' + tokenPtr; | |
default: | |
return 'Error. Sorry, we don\'t know exactly what went wrong' | |
} | |
} | |
function expr() { | |
if (token === 'variable') { | |
getNextToken(); | |
if (!isId(token)) { | |
error(errors.IdExpected, tokenPtr); | |
return 'ERROR'; | |
} | |
var id = token; | |
getNextToken(); | |
var v = value(); | |
if (v === 'ERROR') { | |
return v; | |
} | |
else { | |
return emitVar(id, v); | |
} | |
} | |
else if (token === 'while') { | |
getNextToken(); | |
var b = boolExpr(); | |
if (token !== 'do') { | |
error(errors.DoExpected); | |
return 'ERROR' | |
} | |
getNextToken(); | |
var e = expr(); | |
if (b === 'ERROR' || e === 'ERROR') { | |
return 'ERROR'; | |
} | |
else { | |
return emitWhile(b, e); | |
} | |
} | |
else if (token === 'if') { | |
getNextToken(); | |
boolExpr(); | |
getNextToken(); | |
if (token !== 'then') { | |
return error(errors.ThenExpected); | |
} | |
getNextToken(); | |
expr(); | |
} | |
else if (token === 'define') { | |
getNextToken(); | |
if (!isId()) { | |
return error(errors.IdExpected); | |
} | |
getNextToken(); | |
if (token !== 'arguments') { | |
return error(errors.ArgumentsExpected); | |
} | |
getNextToken(); | |
args(); | |
getNextToken(); | |
if (token !== 'body') { | |
return error(errors.BodyExpected); | |
} | |
getNextToken(); | |
expr(); | |
} | |
else if (token === 'begin') { | |
var list = emitBegin(); | |
getNextToken(); | |
var e = expr(); | |
list += e; | |
getNextToken(); | |
while (token === 'next') { | |
getNextToken(); | |
e = expr(); | |
list += '; ' + e; | |
} | |
getNextToken(); | |
if (token !== 'end') { | |
error(errors.EndExpected); | |
return 'ERROR'; | |
} | |
list += emitEnd(); | |
return list; | |
} | |
else if (token === 'return') { | |
getNextToken(); | |
var e = value(); | |
return emitReturn(e); | |
} | |
else if (token === 'assign') { | |
getNextToken(); | |
if (!isId(token)) { | |
return error(errors.IdExpected); | |
} | |
getNextToken(); | |
value(); | |
} | |
} | |
function value() { | |
if (isId(token) || isNumber(token)) { | |
var t = token; | |
getNextToken(); | |
return t; | |
} | |
else { | |
return expr(); | |
} | |
} | |
function args() { | |
if (isId(token) || isNumber(token) || expr()) { | |
getNextToken(); | |
args(); | |
} | |
} | |
function boolExpr() { | |
if (token === 'true' || token === 'false') { | |
var t = token; | |
getNextToken(); | |
return t; | |
} | |
else if (token === 'not') { | |
getNextToken(); | |
var b = boolExpr(); | |
return '!(' + b + ')'; | |
} | |
else if (token === 'and' || token === 'or') { | |
getNextToken(); | |
var x = boolExpr(); | |
getNextToken(); | |
var y = boolExpr(); | |
return x + ' && ' + y; | |
} | |
else if (isId(token)) { | |
var id = token; | |
getNextToken(); | |
var a = args(); | |
return id + '(' + a + ')'; | |
} | |
} | |
function isId(id) { | |
if (id.length === 0) | |
return false; | |
for (var i = 0; i < id.length; i++) { | |
if (!isLetter(id.charAt(i))) | |
return false; | |
} | |
return true; | |
} | |
function isLetter(str) { | |
return str.length === 1 && str.match(/[a-z]/i); | |
} | |
function isNumber(num) { | |
if (num.length === 0) { | |
return false; | |
} | |
for (var i = 0; i < num.length; i++) { | |
if (!isNum(num.charAt(i))) { | |
return false; | |
} | |
} | |
return true; | |
} | |
function isNum(num) { | |
switch (num) { | |
case '0': | |
case '1': | |
case '2': | |
case '3': | |
case '4': | |
case '5': | |
case '6': | |
case '7': | |
case '8': | |
case '9': | |
return true; | |
default: | |
return false; | |
} | |
} | |
function emitVar(id, value) { | |
return 'var ' + id + ' = ' + value; | |
} | |
function emitWhile(cond, body) { | |
return 'while (' + cond + ') ' + body; | |
} | |
function emitIf(cond, expr) { | |
return 'if (' + cond + ')' + expr; | |
} | |
function emitDefine(id, args, body) { | |
return 'var id = function(' + args + ') ' + body; | |
} | |
function emitBegin() { | |
return '{'; | |
} | |
function emitEnd() { | |
return '}'; | |
} | |
function emitReturn(body) { | |
return 'return ' + body; | |
} | |
function emitAssign(id, value) { | |
return id + ' = ' + value; | |
} | |
function createProgram(name, num) { | |
programs[num] = new WS.Cards(); | |
programs[num].add('Program Options', 'tap for options', | |
'Edit Program (say \"stop editing\" to stop)', function () { | |
var input; | |
WS.speechRecognize('Say Something', function speech(data) { | |
input = data; | |
WS.log(data); | |
}); | |
}, | |
'Run Program', function () {WS.say('menu1')}) | |
programTree.add(name, 'new program', programs[num]); | |
updateTree(); | |
} | |
function updateTree() { | |
WS.cardTree(tree); | |
WS.displayCardTree(); | |
} | |
function server() { | |
//WS.say('Welcome to speakscript'); | |
WS.log(runParser('variable x 42')); | |
WS.log(runParser('while true do return x')); | |
WS.log(runParser('while true do begin return x end')); | |
//tree = new WS.Cards(); | |
//tree.add('Voice Program', | |
// 'Tap to create', function () {WS.say('selected')},function () {WS.say('tapped')}, | |
// 'Create Program', function () { | |
// createProgram('prog' + progNum, progNum); | |
// progNum++; | |
// }, | |
// 'Menu1', function () {WS.say('menu1')}); | |
//tree.add('programs', 'tap to view', (programTree)); | |
//updateTree(); | |
//WS.cameraPhoto(); | |
//WS.cameraVideo(); | |
//WS.cameraOff(); | |
//WS.shutdown(); | |
} | |
function main() { | |
if (WS.scriptVersion(1)) return; | |
ctx = document.getElementById('canvas').getContext("2d"); | |
WS.serverConnect('{{WSUrl}}', server); | |
} | |
window.onload = main; | |
</script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"name":""} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment