Skip to content

Instantly share code, notes, and snippets.

@drewlesueur
Created May 14, 2010 06:12
Show Gist options
  • Save drewlesueur/400867 to your computer and use it in GitHub Desktop.
Save drewlesueur/400867 to your computer and use it in GitHub Desktop.
<!doctype html>
<html>
<head>
<style>
textarea {
  width: 500px;
  height: 400px;
}
</style>
<script>
var pc = 0;
var scope = {};
var types = {};
var lines;
function trim(str) {
      match = str.match(/^[\s]*([^\s]+)[\s]*$/);
      if (match) {
          return match[1];
      }
}
function replacer(match, inner, offset, s) {
    inner = inner.substring(1).substring(0,inner.length-2)
    return "." + lookup(inner);
}
function get_var_name(str) {
  str = str.replace(/(\[[^\]]\]+)/g, replacer);
  return str;
}
var variable = "[\\s]*([a-zA-Z\\']{1}[\\w\\.\\[\\]]*)[\\s]*";
var number = "[\\s]*([\\d]+)[\\s]*";
var other = number;
var funcs = {
  equal: function(a, b) {
     return a == b;
  }, print: function(a){
      console.log("printing + " + a)
  }
 
}
var returns = [];
var last_if = false;
function exec(line) {
    // a = 12
    if (match = line.match(new RegExp("^"+variable+"\\=" + number +"$"))) {
        var ee = match[1];
        ee = get_var_name(ee);
        var or = match[2];
        assign(ee, or);
    //a = b   
    } else if (match = line.match(new RegExp("^" + variable + "\\=" + variable + "$"))) { //  /^[\s]*([\w\.\[\]]+)[\s]*\=[\s]*([\a-zA-Z]{1}[\w\.\[\]]*)[\s]*$/)) { //houses = eight;
       var ee = match[1];
       ee = get_var_name(ee);
       var or = match[2];
       or = lookup(or);
       assign(ee,or);
      
    // a  = "houses"
    } else if (match = line.match(new RegExp("^" + variable + '\\=[\\s]*\\"(.*)\\"[\\s]*$'))) {   //  /^[\s]*([\w\.\[\]]+)[\s]*\=[\s]*\"(.*)\"[\s]*$/)) { //houses = "eight";
       var ee = match[1];
       ee = get_var_name(ee);
       var or = match[2];
       assign(ee,or);
   
    //a = call something
    } else if (match = line.match(new RegExp("^" + variable + '\\='))) {
        console.log(line)
   
   
   
   
    /*
     //just a variable 
   // } else if (match = line.match(new RegExp("^" + variable + "$"))) {
   //     ret = lookup(match[1]);
   //     console.log(ret);
  
   //// array literal
    //} else if (match = line.match(new RegExp("^" + variable + "\\=" + "[\\s]*\\[" + "(.*)" + "\\]$" ))) {
    //  var ee = match[1];
    //  var or = match[2];
    //  var arr = or.split(" ");
    //  for (var i in arr) {
    //      assign(ee + "." + i, lookup(arr[i]));
    //  }
    //  console.log(match[2]);
    */
   
   
   
    // func_name:
    } else if (match = line.match(/^([\s]*)([\w]+):/)) { print: //todo don't rememer parenthasized submatch
        liner = match[0];
        spaces = match[1].length;
        func = match[2];
        console.log(func)
        var i = 0
        var next = 0;
        assign(func, pc + 1);
        while (1) {
            pc++;
            if (pc >= lines.length) {
              break;
            }
            next = lines[pc];
            if (next.match(new RegExp("^[\\s]{"+spaces+"}[^\\s]{1}"))) {
                pc--;
                break;
            } else {
            }
           
        }
    // func_name()
    } else if (match = line.match(new RegExp("^(" + variable + ")\\(\\)"))) { //print()
        var to = match[1];
        to = trim(to)
        console.log("trimmed is " + to);
       
        returns.push(pc)
        pc = lookup(to) - 1;
        console.log(pc)
    //return
    //} else if (line.match(/^[\s]*return/)){
    //   ret = returns.pop();
    //   pc = ret;
    //    console.log(pc)
    } else if (match = line.match(/^([\s])*if (.*)\:/)) {
                  console.log(line)
                  console.log('hello world')
    } else {
        //call a function.
        var match = line.match(new RegExp("^" + variable + " "))
        console.log(match)
        func = match[1]
        len = match[0].length
        arg = line.substring(len)
        console.log(arg)
       
        if (func in funcs) {
            var ret = funcs[func].apply(arg)
            assign("ret", ret)
        } else {
            func = trim(func)
            returns.push(pc)
            pc = lookup(func) - 1;
        }
    }
}
function lookup(v) {
 
  if (v.substr(0,1) == "'")
  return v.substring(1);
 
  v = get_var_name(v);
  console.log("looking up " + v)
  return scope[v];
}
function assign(ee,or){
  for (var i in scope) {
      if (i.match(new RegExp("^" + ee + "\\.*"))) {
          delete scope[i];
      }
  }
  scope[ee] = or
  console.log(ee + "=" + or )
 
  if (typeof or == "string" && or.length > 1)
  for (var i = 0; i < or.length; i++) {
          assign(ee + "." + i, or.charAt(i));
  }
}
function parse(txt) {
  lines = txt.split("\n");
  var line;
  var iters = 0;
  while (pc < lines.length && iters < 25) {
      iters++
      line = lines[pc]
      match = line.match(/^[\s]*/)
      nexto = pc + 1
      if (nexto < lines.length) {
          next_line = lines[nexto]
          next_match = next_line.match(/^[\s]*/)
          if (next_match[0].length == match[0].length - 2) {
               ret = returns.pop();
               pc = ret;
          }
      }
     
      exec(line);
      pc++;
  }
  pc = 0;
 
}
</script>
</head>
<body>
<textarea id="t"></textarea>
<br>
<input type="button" onclick="parse(document.getElementById('t').value)" value="run">
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment