85 lines
1.8 KiB
Lua
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 |