bootstrap compiler
This commit is contained in:
85
src/types.lua
Normal file
85
src/types.lua
Normal file
@@ -0,0 +1,85 @@
|
||||
---@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
|
||||
Reference in New Issue
Block a user