// // Token.swift // Metrika // // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // Copyright © 2026 Simon-Pierre Boucher. All rights reserved. // /// A lexical token of the ZQL command language, carrying its 1-based /// source column so parse errors can point at the offending position. public struct ZQToken: Equatable, Sendable { public enum Kind: Equatable, Sendable { case identifier(String) case number(Double) case string(String) case comma case colon case lparen case rparen case lbracket case rbracket /// Operators: + - * / ^ = == != < <= > >= & | ! # . case op(String) case endOfLine } public let kind: Kind /// 1-based column of the first character of the token. public let column: Int public init(kind: Kind, column: Int) { self.kind = kind self.column = column } } extension ZQToken.Kind { /// Human-readable rendering used in error messages. public var describe: String { switch self { case .identifier(let s): return "'\(s)'" case .number(let n): return "number \(n)" case .string(let s): return "\"\(s)\"" case .comma: return "','" case .colon: return "':'" case .lparen: return "'('" case .rparen: return "')'" case .lbracket: return "'['" case .rbracket: return "']'" case .op(let o): return "'\(o)'" case .endOfLine: return "end of line" } } }