if you see this, your browser
sucks
.
start = numberedLine / statement lineNumber = digits:[0-9]+ { return parseInt(digits.join(""), 10); } numberedLine = numb:lineNumber [ ]+ stat:statement { return [numb,stat]; } integerNumber = sign:"-"? digits:[0-9]+ { var val=parseInt(digits.join(""), 10); if (sign=="-") { return -val; } return val; } floatNumber = sign:"-"? idigits:[0-9]+ "." fdigits:[0-9]+ { var val=0; var ival=parseInt(idigits.join(""), 10); var fval=fdigits.join(""); var concat=ival.toString()+"."+fval.toString(); val=parseFloat(concat); if (sign=="-") { return -val; } return val; } statement = printStmt / returnStmt / listStmt / runStmt / clearStmt / gotoStmt / inputStmt / endStmt / helpStmt / remStmt / verStmt / letStmt / forStmt / nextStmt / ifStmt / inputStmt / gosubStmt / returnStmt / loadStmt / dirStmt / saveStmt / plotStmt / readStmt / dataStmt / restoreStmt printStmt = "print"i ([ ])* prtarg:(expression)* { if (prtarg.length>0) { return ["print",prtarg]; } else return ["print"]; } quotedString = ('"' strg:[a-zA-Z0-9 \#\.\,\*\$\;\:\'\`\(\)\|\[\]\/\+\-\\\@\=\_\~\?\*\!]* '"') { return "'"+strg.join("")+"'"; } charLiteral = ("'" strg:[a-zA-Z0-9 \.\,\*\$\;\:\?\*\!\|\\\/\-]* "'") { return "'"+strg.join("")+"'"; } variable = the1var:[a-zA-Z] the2var:[a-zA-Z0-9\$]* { return the1var+the2var.join(""); } readStmt = "read"i [ ]+ head:variable tail:("," variable)* { var varArray=new Array(); varArray.push(head); for (var i = 0; i < tail.length; i++) { varArray.push(tail[i][1]); } return ["read",varArray]; } dataStmt = "data"i [ ]+ head:dataData tail:("," dataData)* { var dataArray=new Array(); dataArray.push(head); for (var i = 0; i < tail.length; i++) { dataArray.push(tail[i][1]); } return ["data",dataArray]; } restoreStmt = "restore"i { return ["restore"]; } dataData = floatNumber / integerNumber / quotedString functionCall = "rnd"i "(" maxr:expression ")" { return { tag: "rnd", imax: maxr }; } / "chr$"i "(" asciicode:expression ")" { return { tag: "chr$", ascii: asciicode }; } / "sin"i "(" operand:expression ")" { return { tag: "sin",opz:operand }; } / "cos"i "(" operand:expression ")" { return { tag: "cos",opz:operand }; } / "int"i "(" operand:expression ")" { return { tag: "int",opz:operand }; } /* mathematical expression */ additiveOperator = "+" { return "+"; } / "-" { return "-"; } multiplicativeOperator = "*" { return "*"; } / "/" { return "/"; } expression = additive additive = head:multiplicative tail:(additiveOperator multiplicative)* { var result = head; for (var i = 0; i < tail.length; i++) { result = { tag: tail[i][0], left: result, right: tail[i][1] }; } return result; } multiplicative = head:primary tail:(multiplicativeOperator primary)* { var result = head; for (var i = 0; i < tail.length; i++) { result = { tag: tail[i][0], left: result, right: tail[i][1] }; } return result; } primary = floatNumber / integerNumber / quotedString / functionCall / variable / charLiteral / "(" additive:additive ")" { return additive; } /* other statements */ plotStmt = "plot"i [ ]+ thechar:expression [,] posx:expression [,] posy:expression { return ["plot",thechar,posx,posy]; } dirStmt = "directory"i { return ["directory"]; } / "dir"i { return ["directory"]; } loadStmt = "load"i [ ]+ progname:quotedString { return ["load",progname]; } saveStmt = "save"i [ ]+ progname:quotedString { return ["save",progname]; } ifStmt = "if"i [ ]+ lexpr:expression [ ]* rop:relop [ ]* rexpr:expression [ ]+ "then"i [ ]+ stat:statement { return ["if",lexpr,rop,rexpr,stat]; } relop = "<=" / ">=" / "<" / ">" / "=" inputStmt = "input"i [ ]+ avar:variable {return ["input",avar]; } gosubStmt = "gosub"i [ ]+ anum:lineNumber { return ["gosub",anum]; } returnStmt = "return"i { return ["return"]; } forStmt = "for"i [ ]+ avar:variable [=] exprfrom:expression [ ]+ "to"i [ ]+ exprto:expression { return ["for",avar,exprfrom,exprto]; } nextStmt = "next"i [ ]+ avar:variable { return ["next",avar]; } letStmt = "let"i [ ]+ avar:variable [=] expr:expression { return ["let",avar,expr]; } remStmt = "rem"i [^]* {return ["rem"]; } inputStmt = "input"i [ ]+ avar:variable { return ["input",avar]; } gotoStmt = "goto"i [ ]+ anum:lineNumber { return ["goto",anum]; } endStmt = "end"i { return ["end"]; } returnStmt = "return"i { return ["return"]; } listStmt = "list"i { return ["list"]; } runStmt = "run"i { return ["run"]; } clearStmt = "cls"i { return ["cls"]; } helpStmt = "help"i { return ["help"]; } verStmt = "version"i { return ["version"]; }