hclang
Version:
Homoiconic C: Programming without a Language
110 lines • 8.24 kB
JavaScript
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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