Files
Lake/src/types.lua
2026-04-25 16:59:45 +02:00

85 lines
1.8 KiB
Lua

---@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