hclang
Version:
Homoiconic C: Programming without a Language
55 lines • 4.14 kB
JavaScript
import { Frame, FrameArray, FrameExpr } from '../frames.js';
import { Terminal } from './terminals.js';
export class ParsePipe extends FrameArray {
constructor(out, factory) {
const meta = {};
meta[ParsePipe.kOUT] = out;
meta[Frame.kEND] = Terminal.end();
super([], meta);
this.Factory = factory;
this.collector = [];
}
next(statement = false) {
if (this.length() === 0) {
return this;
}
const term = this.asArray();
const expr = new FrameExpr(term);
if (statement) {
expr.is.statement = true;
}
this.collector.push(expr);
this.reset();
return this;
}
push(Factory) {
const child = new ParsePipe(this, Factory);
return child;
}
pop(Factory) {
const parent = this.get(ParsePipe.kOUT);
this.finish(Frame.nil);
return parent;
}
canPop(Factory) {
const match = (this.Factory.name === Factory.name);
if (!match) {
console.error(`ParsePipe.canPop.failed: ${Factory.name} cannot pop ${this.Factory.name}`);
}
return match;
}
finish(terminal) {
this.next();
const out = this.get(Frame.kOUT);
const value = this.makeFrame();
const result = out.call(value);
out.call(terminal);
return result;
}
makeFrame() {
const group = new this.Factory(this.collector);
this.collector = [];
return group;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtcGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRlL3BhcnNlLXBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3BFLE9BQU8sRUFBVyxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVsRCxNQUFNLE9BQU8sU0FBVSxTQUFRLFVBQVU7SUFJdkMsWUFBYSxHQUFVLEVBQUUsT0FBWTtRQUNuQyxNQUFNLElBQUksR0FBWSxFQUFFLENBQUE7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDakMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO0lBQ3JCLENBQUM7SUFFTSxJQUFJLENBQUUsWUFBcUIsS0FBSztRQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtTQUN6QjtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNaLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVNLElBQUksQ0FBRSxPQUFZO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxQyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFTSxHQUFHLENBQUUsT0FBWTtRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWMsQ0FBQTtRQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN0QixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxNQUFNLENBQUUsT0FBWTtRQUN6QixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsT0FBTyxDQUFDLElBQUksZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7U0FDMUY7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFTSxNQUFNLENBQUUsUUFBYTtRQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDOUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xCLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVTLFNBQVM7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUNuQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7Q0FDRiJ9