UNPKG

@taml/parser

Version:

Parser for TAML (Terminal ANSI Markup Language) that generates AST nodes

130 lines (128 loc) 9.33 kB
/** * Error types for TAML parser */ /** * Base class for all TAML parsing errors */ export class TamlParseError extends Error { position; line; column; source; constructor(message, position, line, column, source) { super(message); this.position = position; this.line = line; this.column = column; this.source = source; this.name = "TamlParseError"; } /** * Create a detailed error message with context */ getDetailedMessage() { if (!this.source) { return this.message; } const lines = this.source.split("\n"); const errorLine = lines[this.line - 1]; const pointer = `${" ".repeat(Math.max(0, this.column - 1))}^`; return `${this.message} ${this.line} | ${errorLine || ""} ${" ".repeat(String(this.line).length)} | ${pointer} Position: line ${this.line}, column ${this.column}`; } } /** * Error thrown when an invalid tag name is encountered */ export class InvalidTagError extends TamlParseError { tagName; constructor(tagName, position, line, column, source) { super(`Invalid tag name '${tagName}' at line ${line}, column ${column}. Tag names must be one of the 37 valid TAML tags.`, position, line, column, source); this.tagName = tagName; this.name = "InvalidTagError"; } } /** * Error thrown when a tag is not properly closed */ export class UnclosedTagError extends TamlParseError { tagName; constructor(tagName, position, line, column, source) { super(`Unclosed tag '${tagName}' at line ${line}, column ${column}. Expected '</${tagName}>' before end of input.`, position, line, column, source); this.tagName = tagName; this.name = "UnclosedTagError"; } } /** * Error thrown when closing tag doesn't match opening tag */ export class MismatchedTagError extends TamlParseError { expected; actual; constructor(expected, actual, position, line, column, source) { super(`Mismatched closing tag at line ${line}, column ${column}. Expected '</${expected}>' but found '</${actual}>'.`, position, line, column, source); this.expected = expected; this.actual = actual; this.name = "MismatchedTagError"; } } /** * Error thrown when a tag is malformed (e.g., missing brackets, spaces in tag name) */ export class MalformedTagError extends TamlParseError { content; constructor(content, position, line, column, source) { super(`Malformed tag '${content}' at line ${line}, column ${column}. Tags must follow the pattern '<tagName>' or '</tagName>'.`, position, line, column, source); this.content = content; this.name = "MalformedTagError"; } } /** * Error thrown when an unexpected end of input is encountered */ export class UnexpectedEndOfInputError extends TamlParseError { constructor(position, line, column, source, context) { const contextMsg = context ? ` while ${context}` : ""; super(`Unexpected end of input at line ${line}, column ${column}${contextMsg}.`, position, line, column, source); this.name = "UnexpectedEndOfInputError"; } } /** * Error thrown when an unexpected character is encountered */ export class UnexpectedCharacterError extends TamlParseError { character; constructor(character, position, line, column, source, expected) { const expectedMsg = expected ? ` Expected ${expected}.` : ""; super(`Unexpected character '${character}' at line ${line}, column ${column}.${expectedMsg}`, position, line, column, source); this.character = character; this.name = "UnexpectedCharacterError"; } } /** * Helper function to create position information */ export function calculatePosition(source, index) { let line = 1; let column = 1; for (let i = 0; i < index && i < source.length; i++) { if (source[i] === "\n") { line++; column = 1; } else { column++; } } return { line, column }; } /** * Helper function to create error with position calculated from source */ export function createErrorAtPosition(ErrorClass, source, position, ...additionalArgs) { const { line, column } = calculatePosition(source, position); return new ErrorClass(...additionalArgs, position, line, column, source); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFHckI7SUFDQTtJQUNBO0lBQ0E7SUFMbEIsWUFDRSxPQUFlLEVBQ0MsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLE1BQWMsRUFDZCxNQUFlO1FBRS9CLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUxDLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBRy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFL0QsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPOztFQUV4QixJQUFJLENBQUMsSUFBSSxNQUFNLFNBQVMsSUFBSSxFQUFFO0VBQzlCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMs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