lovelang
Version:
🖤 LoveLang: A romantic wrapper language over TypeScript/TSX
59 lines (58 loc) • 1.96 kB
JavaScript
;
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;
}