[READ-ONLY] Mirror of https://github.com/probablykasper/limp. Programming language made in JS, for fun (unfinished) limp.kasper.space
language
0

Configure Feed

Select the types of activity you want to include in your feed.

Basic AST parsing of operators

KH (Jun 8, 2017, 3:43 PM +0200) 5944fc46 9e86105e

+26 -14
+26 -14
js/limp.js
··· 16 16 if (type == "err") { 17 17 console.error("[limp] "+msg); 18 18 } else if (type == "inf") { 19 - console.log("[limp] "+msg); 19 + // console.log("[limp] "+msg); 20 20 } 21 21 } 22 22 ··· 177 177 // LEXER 178 178 179 179 var stat = 0; 180 - var tokens = []; 181 - tokens[stat] = []; 182 - // var tokens = []; 180 + var statements = []; 181 + statements[stat] = []; 183 182 var ast = [] // parseInputPosition 183 + 184 184 readNext(); 185 185 function readNext() { 186 186 // limpLog("inf", `--- pos${pos} (${line}:${col})`); 187 187 var value = ""; 188 - var currentStat = tokens[stat]; 188 + var currentStat = statements[stat]; 189 189 if (endOfInput()) { 190 - limpLog("inf", "---------------------------- script finished"); 190 + // limpLog("inf", "---------------------------- script finished"); 191 191 parse(); 192 - console.log(tokens); 193 192 // limpLog("inf", statements); 194 193 } else if ( isWhitespace() ) { // WHITESPACE 195 194 value = "[whitespace]"; ··· 200 199 jumpChar(-1); 201 200 } else if ( currentCharIsString() ) { // STRING 202 201 value = {type: "string", value: readString()}; 203 - tokens[stat].push(value); 202 + statements[stat].push(value); 204 203 } else if ( isDigit() ) { // NUMBER 205 204 value = {type: "number", value: readNumber()}; 206 - tokens[stat].push(value); 205 + statements[stat].push(value); 207 206 } else if ( isPunctation() ) { // PUNCTATION 208 207 value = {type: "punctation", value: currentChar()}; 209 - tokens[stat].push(value); 208 + // statements[stat].push(value); 210 209 if (currentChar() == ";") { 211 210 stat++; 212 - tokens[stat] = []; 211 + statements[stat] = []; 213 212 } 214 213 } else if ( isOperator() ) { // OPERATOR 215 214 value = readOperator(); ··· 227 226 default: 228 227 value = {type: "variable", value: value}; 229 228 } 230 - tokens[stat].push(value); 229 + statements[stat].push(value); 231 230 } else { 231 + console.log(currentChar()); 232 232 limpLog("err", `Didn't understand character "${currentChar()}" at ${line}:${col}`); 233 233 } 234 234 if (value != "") { ··· 251 251 252 252 // PARSE 253 253 function parse() { 254 - for (var tokenIndex = 0; tokenIndex < tokens.length; tokenIndex++) { 255 - var currentStat = tokens[tokenIndex]; 254 + 255 + 256 + var ast = statements; 257 + // loop through statements & tokens 258 + for (var si = 0; si < ast.length; si++) { // statement index 259 + for (var ti = 0; ti < ast[si].length; ti++) { // token index 260 + var token = ast[si][ti]; 261 + if (token.type == "operator") { 262 + token.left = ast[si][ti-1]; 263 + token.right = ast[si][ti+1]; 264 + ast[si].splice(ti-1, 3, token); 265 + } 266 + } 256 267 } 268 + limpLog("inf", ast); 257 269 } 258 270 }