UNPKG

hclang

Version:

Homoiconic C: Programming without a Language

110 lines 8.24 kB
import { Frame, FrameAtom, FrameBytes, FrameComment, FrameQuote, NilContext } from '../frames.js'; import { LexBytes } from './lex-bytes.js'; import { LexPipe } from './lex-pipe.js'; import { terminals } from './terminals.js'; export class Token extends FrameAtom { constructor(data) { super(NilContext); this.data = data; } called_by(callee, parameter) { return callee.apply(this.data, parameter); } toData() { return this.data; } inspect() { return `Token[${this.data.inspect()}]`; } } export class Lex extends Frame { static isTerminal(char) { const terms = Object.keys(terminals); return terms.includes(char); } constructor(Factory) { super(); this.Factory = Factory; this.pipe = new LexPipe(this); this.body = ''; this.sample = new Factory(''); this.source = ''; this.is.void = true; const name = this.sample.className(); this.id = this.id + '.' + name; } // TODO: use terminal to determine next parsing class // Right now, FrameSpace/FrameNumber consume the initial '#' of a comment // That should only happen at the end of a Quote call(argument, _parameter = Frame.nil) { const char = argument.toString(); const end = this.isEnd(char); const terminal = Lex.isTerminal(char); const not_quote = !this.isQuote(); if (end && terminal) { // ends token on a terminal return this.finish(argument, true); } if (end) { // ends token, but not on a terminal const use_arg_for_next_token = not_quote && !this.isComment(); const result = this.finish(argument, use_arg_for_next_token); return result; } if (terminal && not_quote) { // unquoted terminal implicitly ends token return this.finish(argument, true); } // otherwise, add to body since still in interior // including quoted terminals if (this.body === '') { this.body = this.source; } this.body = this.body + argument.toString(); return this; } toString() { return this.id + `[${this.body}]`; } isEnd(char) { return !this.sample.canInclude(char); } isComment() { return (this.sample instanceof FrameComment); } isQuote() { return (this.sample instanceof FrameQuote); } finish(argument, passAlong) { const recurse = this.checkRecursive(argument); if (recurse !== null) { return recurse; } this.exportFrame(); if (passAlong) { const result = this.up.call(argument); return result; } return this.up; } checkRecursive(_argument) { if (!(this.sample instanceof FrameBytes)) { return null; } const n = parseInt(this.body, 10); const lex = new LexBytes(n, this.up); return lex; } exportFrame() { const output = this.makeFrame(); const out = this.get(Frame.kOUT); const result = out.call(output); return result; } makeFrame() { if (this.body === '') { this.body = this.source; } const frame = new this.Factory(this.body); this.body = ''; return new Token(frame); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4ZWN1dGUvbGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUF5QixVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBSTFDLE1BQU0sT0FBTyxLQUFNLFNBQVEsU0FBUztJQUNsQyxZQUF1QixJQUFXO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQURJLFNBQUksR0FBSixJQUFJLENBQU87SUFFbEMsQ0FBQztJQUVNLFNBQVMsQ0FBRSxNQUFhLEVBQUUsU0FBZ0I7UUFDL0MsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVTLE1BQU07UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVNLE9BQU87UUFDWixPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFBO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQUNyQixNQUFNLENBQUMsVUFBVSxDQUFFLElBQVk7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQU9ELFlBQThCLE9BQVk7UUFDeEMsS0FBSyxFQUFFLENBQUE7UUFEcUIs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