Skip to content

Instantly share code, notes, and snippets.

@connerbrooks
Forked from dashster18/glass.html
Created April 6, 2014 09:15
Show Gist options
  • Save connerbrooks/10003464 to your computer and use it in GitHub Desktop.
Save connerbrooks/10003464 to your computer and use it in GitHub Desktop.
[wearscript] voicescript
<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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment