earl-lang
Version:
Earl Bahasa Pemrograman Alur Kerja
75 lines (57 loc) • 2.34 kB
JavaScript
// modules/ulangi.js
const { resolveToken } = require('./tampilkan');
const { laksanakanAST } = require('../pelaksana-ast');
async function ulangi(tokens, modules, context) {
if (tokens[1] === 'setiap' && tokens[2] === 'dari') {
const sumber = tokens[3];
if (sumber.startsWith(':') && sumber.endsWith(':')) {
sumber = sumber.slice(1, -1);
}
const list = resolveToken(sumber, context, modules);
if (sumber.includes('.')) {
const [instanceName, attr] = sumber.split('.');
const instance = context.lingkup[0][instanceName];
if (instance && instance.__tipe) {
const kelas = context.lingkup[0][instance.__tipe];
if (!kelas || kelas.__tipe !== 'kelas') {
console.error(`Tipe '${instance.__tipe}' bukan kelas yang valid.`);
return;
}
}
}
if (!Array.isArray(list)) {
console.error(`Sumber '${sumber}' bukan daftar atau array.`);
return;
}
for (const item of list) {
context.lingkup.push({ item: {...item} });
context.berhenti = false;
context.lanjutkan = false;
if (context.currentNode?.body) {
await laksanakanAST(context.currentNode.body, modules, context);
}
context.lingkup.pop();
if (context.berhenti) break;
if (context.lanjutkan) continue;
}
} else {
const count = parseInt(resolveToken(tokens[1], context, modules));
if (isNaN(count)) {
console.error(`Nilai perulangan tidak valid: ${tokens[1]}`);
return;
}
for (let i = 0; i < count; i++) {
context.lingkup.push({ index: i });
context.berhenti = false;
context.lanjutkan = false;
if (context.currentNode?.body) {
await laksanakanAST(context.currentNode.body, modules, context);
}
context.lingkup.pop();
if (context.berhenti) break;
if (context.lanjutkan) continue;
}
}
}
ulangi.isBlock = true;
module.exports = { ulangi };