---@class Location ---@field file string ---@field line integer ---@field column integer Location = {} function Location:new(file) return setmetatable({file = file, column = 1, line = 1},{__index = self}) end ---@return Location function Location:clone() return setmetatable({file = self.file, column = self.column, line = self.line}, getmetatable(self)) end function Location:skip(chr) for i=1,#chr do self.column = self.column + 1 local c = chr:sub(i, i) if c == '\n' then self.column = 1 self.line = self.line + 1 end end end function Location:format() return self.file .. ":" .. self.line .. ":" .. self.column end ---@class Token ---@field kind string ---@field content any ---@field location Location Token = {} function Token:new(kind, content, location) return setmetatable({ kind = kind, content = content, location = location }, {__index = self}) end ---@class Error ---@field location Location ---@field message string ---@field origin string Error = {} function Error:new(message,origin, location) return setmetatable({ message = message, origin = origin, location = location }, {__index = self}) end function Error:format() local capitalizedOrigin = self.origin:sub(1,1):upper() .. self.origin:sub(2):lower() local locationString = self.location:format() -- local msg = string.format("%s:%d %s", err.location.file, err.location.line, err.message) return capitalizedOrigin .. " error: " .. locationString .. ": " .. self.message; -- print("\x1b[31m" .. msg .. "\x1b[0m") end function Error:print() print("\x1b[31m" .. self:format() .. "\x1b[0m") end ---@class Node ---@field kind string ---@field content any ---@field location Location Node = {} function Node:new(kind,content,location) return setmetatable({ kind = kind, content = content, location = location, }, {__index = self}) end