UNPKG

lovelang

Version:

🖤 LoveLang: A romantic wrapper language over TypeScript/TSX

59 lines (58 loc) • 1.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = parse; function parse(tokens) { let pos = 0; const peek = () => tokens[pos]; const consume = (type, value) => { const t = tokens[pos++]; if ((type && t.type !== type) || (value && t.value !== value)) throw new Error(`Expected ${type}:${value}, got ${t.type}:${t.value}`); return t; }; function parseVarDecl() { consume("KEYWORD", "hi babe"); consume("PUNCT", "--"); consume("KEYWORD", "this is"); const name = consume("STRING").value; consume("PUNCT", "="); const expr = parseExpr(); consume("PUNCT", ";"); return { type: "VarDecl", name, expr }; } function parsePrint() { consume("KEYWORD", "babe,"); consume("KEYWORD", "say"); const expr = parseExpr(); consume("PUNCT", ";"); return { type: "PrintStmt", expr }; } // … implement parseLoop, parseIf, parseFunc, parseClass, parseTryCatch, parseJSX, parseExprStmt function parseExpr() { const t = peek(); if (t.type === "STRING") { pos++; return { type: "StringLiteral", value: t.value }; } if (t.type === "NUMBER") { pos++; return { type: "NumberLiteral", value: t.value }; } if (t.type === "IDENT") { pos++; return { type: "Identifier", value: t.value }; } throw new Error(`Unexpected expr token ${t.value}`); } const ast = []; while (pos < tokens.length) { const t = peek(); if (t.type === "KEYWORD" && t.value === "hi babe") ast.push(parseVarDecl()); else if (t.type === "KEYWORD" && t.value === "babe,") ast.push(parsePrint()); else throw new Error(`Cannot parse statement at ${t.value}`); } return ast; }