|
|
module.exports = genOpt;
function genOpt(ctx, ast) { if (ast.type == "OP") { if (ast.op == "=") { return genOptVarAssignement(ctx, ast); } else { error(ctx, ast, "GENOPT -> Invalid operation: " + ast.op); } } else if (ast.type == "TEMPLATEDEF") { return genOptTemplateDef(ctx, ast); } else { error(ctx, ast, "GENOPT -> Invalid AST node type: " + ast.type); } }
function error(ctx, ast, errStr) { ctx.error = { pos: { first_line: ast.first_line, first_column: ast.first_column, last_line: ast.last_line, last_column: ast.last_column }, errStr: errStr, errFile: ctx.fileName, ast: ast }; }
function genOptTemplateDef(ctx, ast) { if (ctx.templates[ast.name]) { return error(ctx, ast, "Template name already exists: "+ast.name); } ctx.templates[ast.name] = { type: "TEMPLATE", params: ast.params, block: ast.block, fileName: ctx.fileName, filePath: ctx.filePath }; }
function genOptVarAssignement(ctx, ast) { let varName; if (ast.values[0].type == "DECLARE") { varName = genOptCode(ctx, ast.values[0]); if (ctx.error) return; } else { varName = ast.values[0]; } const varContent = getScope(ctx, varName.name, varName.selectors); if (ctx.error) return;
if ((typeof(varContent) != "object")||(varContent == null)) return error(ctx, ast, "Variable not defined");
if (varContent.type == "COMPONENT") return genOptInstantiateComponet(ctx, varName, ast.values[1]); if (varContent.type == "SIGNAL") return error(ctx, ast, "Cannot assig to a signal with `=` use <-- or <== ops");
const res = genOpt(ctx, ast.values[1]); if (ctx.error) return;
setScope(ctx, varName.name, varName.selectors, res);
return v; }
|