Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- io.open("DEBUG.lua",'w'):close() -- clears file
- love.graphics.setBackgroundColor(1,0,0)
- local print = function (...)
- local f = io.open("DEBUG.lua","a+")
- f:write(tostring(...))
- f:close()
- end
- local compile_path = "language/test2.txt"
- local file = [[]]
- local new_file = [[]]
- for line in io.lines(compile_path) do
- file = file..("\n"..line)
- end
- local tools=require("language/tools")
- tools.file_table = setmetatable({},{__index = function(t,k) t[k] = '' return t[k] end})
- local file_table = tools.file_table
- local gmatch_sf = tools.gmatch_start_finish --
- local find_closing_brace = tools.find_closing_brace
- local find_closing_bracket = tools.find_closing_bracket --> ( line_num, bracket_pos )
- local find_next_occurance = tools.find_next_occurance --> ( line_number, current_position, pattern )
- local find_ending_string = tools.find_ending_string
- local adaptive_gmatch_sf = tools.adaptive_gmatch_start_finish
- local split = function(line, position)
- local l = file_table[line]
- file_table[line] = l:sub(1,position)
- table.insert( file_table, line+1, l:sub(position+1))
- end
- for line in file:gmatch('[^\n]+') do
- file_table[#file_table+1] = line
- end
- local strings = {}
- for i,line in pairs(file_table) do
- for s,f in gmatch_sf(line, "'") do
- local l,st,fi = find_next_occurance(i, f, "'")
- local str = line:sub(s,f)
- end
- end
- -- Line breaks for ;;
- do
- local i=0
- while #file_table >= i do
- local line = file_table[i]
- local st = line:find(";")
- if st then
- file_table[i] = line:sub(1,st-1)
- table.insert(file_table,i+1, line:sub(st+1))
- end
- i=i+1
- end
- end
- -- Getting rid of lua keywords, extra parsing
- do
- for i,line in pairs(file_table) do
- local l
- l=line:gsub("local", "_NV_local")
- l=l:gsub("break","_NV_break")
- l=l:gsub("setmetatable","_NV_setmetatable")
- l=l:gsub("elif", "elseif")
- l=l:gsub("repeat","_NV_repeat")
- l=l:gsub("until","_NV_until")
- l=l:gsub("do","_NV_do")
- l=l:gsub("end","_NV_end")
- l=l:gsub("then","_NV_then")
- l=l:gsub("local","_NV_local")
- l=l:gsub("let","local")
- l=l:gsub("return","_NV_return")
- l=l:gsub("->"," return ")
- file_table[i] = l
- end
- end
- local operators = {"+","-","/","^","*","/%/"}
- for i,line in ipairs(file_table) do --PARSER
- -- comment parser
- do
- local comment_start = line:find("\\\\")
- if comment_start then
- file_table[i] = line:sub(1,comment_start-1)
- end
- end
- -- Syntax sugar for metamethods.
- do
- local line = file_table[i]
- line = line:gsub("%[%+%]",".__add")
- line = line:gsub("%[%-%]",".__sub")
- line = line:gsub("%[%*%]",".__mul")
- line = line:gsub("%[%/%]",".__div")
- line = line:gsub("%[%/%/%]",".__idiv")
- line = line:gsub("%[%%%]",".__mod")
- line = line:gsub("%[%^%]",".__pow")
- line = line:gsub("%[#%]", ".__len")
- line = line:gsub("%[%?%]",".__index")
- line = line:gsub("%[=%]",".__newindex")
- line = line:gsub("%[%(%)%]",".__call")
- line = line:gsub("%['%]",".__tostring")
- line = line:gsub('%["%]',".__tostring")
- line = line:gsub("%[<%]",".__lt")
- line = line:gsub("%[<=%]",".__le")
- line = line:gsub("%[==%]",".__eq")
- line = line:gsub("%[:k%]",".__mode")
- file_table[i] = line
- end
- -- Syntax sugar allowing +=, -= etc.
- do
- local line = file_table[i]
- for _,v in ipairs(operators) do -- !!! Enabling += !!!
- if line:match("%"..v.."%=") then
- line = line:gsub("%"..v.."%=", "%=".."%"..v) -- reverses, so now is =+
- local var = line:sub(1, line:find("=")-1)
- line = line:gsub("=", "= "..var)
- end
- end
- file_table[i] = line
- end
- -- Syntax sugar x ?= y --->>> x = x or y
- do
- local line = file_table[i]
- if line:find("?=",1,true) then
- local add_local = line:match("local ") or ""
- local temp = line:gsub("local ","")
- local var = temp:sub(1, temp:find("?")-1)
- line = add_local..var.." = "..var.." or "..line:sub(line:find("?=")+2)
- end
- file_table[i] = line
- end
- -- object parent getting: obj[@] = t and t = obj[@]
- do
- local line = file_table[i]
- if line:match("%[@%]") then
- local temp_tabl = {}
- local temp_iter = 1
- for s,f in gmatch_sf(line, "%[@%]") do
- temp_tabl[temp_iter] = {s,f}
- temp_iter = temp_iter + 1
- end
- --for s,f in gmatch_sf(line,"%[@%]") do
- for indx=#temp_tabl,1,-1 do
- local s = temp_tabl[indx][1]
- local f = temp_tabl[indx][2]
- local eq = line:sub(f+1):match("[^%s^%w^%[^%]]+")
- if (eq == "=") then
- local eq_pos = line:find("=")
- local before_len = #line
- line = "NVsetmeta("..line:sub(1,s-1)..", "..line:sub(eq_pos+1)..")"
- local after_len = #line
- displace = after_len-before_len
- -- WORKING!
- else -- Will be ~=, ==, etc.
- line = line:sub(1,s-1).."._NV"..line:sub(f+1)
- end
- end
- end
- file_table[i] = line
- end
- -- static functions
- do
- local line = file_table[i]
- if line:match("\\%(") then
- for s,f in adaptive_gmatch_sf(i, "\\%(") do
- local line_num,to_end = find_closing_bracket(i,f)
- local l = file_table[line_num]
- file_table[line_num] = l:sub(1,to_end-1).." end) "..l:sub(to_end+1)
- local line = file_table[i]
- line = line:sub(1,s-1).." (function "..line:sub(f+1)
- file_table[i] = line
- end
- end
- end
- -- argless functions
- do
- local line = file_table[i]
- if line:match("!%(") then
- for s,f in adaptive_gmatch_sf(i, "!%(") do
- local line_num,to_end = find_closing_bracket(i,f)
- local l = file_table[line_num]
- file_table[line_num] = l:sub(1,to_end-1).." end) "..l:sub(to_end+1)
- local line = file_table[i]
- line = line:sub(1,s-1).." (function()"..line:sub(f+1)
- file_table[i] = line
- end
- end
- end
- -- ! syntax for argless funcs (and calling argless funcs)
- do
- file_table[i] = file_table[i]:gsub("!","()")
- end
- -- special methods (MAY BE REMOVED)
- do
- --[[
- local line = file_table[i]
- if line:match(":%(") then
- local s,f = line:find(":(",1,true)
- split(i, f)
- local line_num,to_end = find_closing_bracket(i,f)
- assert(line_num and to_end)
- local l = file_table[line_num]
- file_table[line_num] = l:sub(1,to_end-1).."} end) "..l:sub(to_end+1)
- line = line:sub(1,s-1).." (function "..line:sub(f+1)
- file_table[i] = line
- local li,st = find_next_occurance(i, f+2, "[%(!]")
- local temp = file_table[li]
- local self_var = "_NV_SELF_"..tostring(_NV_COUNTER)
- if temp:sub(st) == "!" then
- file_table[li] = temp:sub(1,st-1).." ("..self_var..")"..temp:sub(st+1)
- else
- local have_comma = ""
- -- Checking if there are user defined arguments inside the method args:
- local line_arg_br, arg_br = find_closing_bracket(li, st+1)
- if line_arg_br == i then
- if temp:sub(st, arg_br):match("%a+") then
- have_comma = ","
- end
- else
- for _n=li,line_arg_br-1 do
- if file_table[_n]:match("%a+") then
- have_comma = ","
- end
- end
- if file_table[line_arg_br]:sub(1,arg_br):match("%a+") then
- have_comma = ","
- end
- end
- file_table[li] = temp:sub(1,st-1).." ("..self_var..have_comma..temp:sub(st+1)
- end
- _NV_COUNTER = _NV_COUNTER + 1
- table.insert(file_table, li+1,self_var..":{")
- end
- ]]
- end
- -- object assignment syntax. obj:{ .x = 10 }
- do
- local line = file_table[i]
- if line:match(":{") then
- local _,temp_open_brace_pos = line:find(":{")
- local var = line:sub(1,line:find(":{")-1)
- file_table[i] = " do "..line:sub(temp_open_brace_pos+1)
- local close_brace_line,close_brace_pos = find_closing_brace(i,temp_open_brace_pos)
- -- First iteration is unique. There was no faster way to do this
- -- :/
- -- (Yes, I know it's bad practice and I should use loop yada yada)
- do
- local line = file_table[i]
- local line_start_char = line:sub(1,1)
- if line_start_char == "." then
- line = var..line
- elseif line_start_char == "[" then
- line = var..line
- elseif line_start_char == ":" then
- line = var..line
- end
- line = line:gsub("::",var)
- line = line:gsub(" %.",var..".")
- line = line:gsub("=%.","="..var..".")
- line = line:gsub("%(%.","("..var..".")
- line = line:gsub("{%.","{"..var..".")
- line = line:gsub("%+%.","+"..var..".")
- line = line:gsub("%-%.","-"..var..".")
- line = line:gsub("%*%.","*"..var..".")
- line = line:gsub("/%.","/"..var..".")
- line = line:gsub("%^%.","^"..var..".")
- line = line:gsub("%%%.","%"..var..".")
- line = line:gsub(">%.",">"..var..".")
- line = line:gsub("<%.","<"..var..".")
- line = line:gsub(" %[",var.."[")
- line = line:gsub("%(%[","("..var.."[")
- line = line:gsub("{%[","{"..var.."[")
- line = line:gsub("=%[","="..var.."[")
- line = line:gsub("%+%[","+"..var.."[")
- line = line:gsub("%-%[","-"..var.."[")
- line = line:gsub("%*%[","*"..var.."[")
- line = line:gsub("/%[","/"..var.."[")
- line = line:gsub("%^%[","^"..var.."[")
- line = line:gsub("%%%[","%"..var.."[")
- line = line:gsub(">%[",">"..var.."[")
- line = line:gsub("<%[","<"..var.."[")
- line = line:gsub(" :",var..":")
- line = line:gsub("%(:","("..var..":")
- line = line:gsub("{:","{"..var..":")
- line = line:gsub("=:","="..var..":")
- line = line:gsub("%+:","+"..var..":")
- line = line:gsub("%-:","-"..var..":")
- line = line:gsub("%*:","*"..var..":")
- line = line:gsub("/:","/"..var..":")
- line = line:gsub("%^:","^"..var..":")
- line = line:gsub("%%:","%"..var..":")
- line = line:gsub(">:",">"..var..":")
- line = line:gsub("<:","<"..var..":")
- file_table[i] = line
- end
- local n = i+1
- while n<=close_brace_line do
- line = file_table[n]
- local line_start_char = line:sub(1,2)
- if line_start_char:sub(1,1) == "." then
- line = var..line
- elseif line_start_char:sub(1,1) == "[" then
- line = var..line
- elseif line_start_char == "::" then
- line = var..line:sub(3)
- elseif line_start_char:sub(1,1) == ":" then
- line = var..line
- end
- line = line:gsub("::",var)
- line = line:gsub(" %."," "..var..".")
- line = line:gsub("=%.","="..var..".")
- line = line:gsub("%(%.","("..var..".")
- line = line:gsub("{%.","{"..var..".")
- line = line:gsub("%+%.","+"..var..".")
- line = line:gsub("%-%.","-"..var..".")
- line = line:gsub("%*%.","*"..var..".")
- line = line:gsub("/%.","/"..var..".")
- line = line:gsub("%^%.","^"..var..".")
- line = line:gsub("%%%.","%"..var..".")
- line = line:gsub(">%.",">"..var..".")
- line = line:gsub("<%.","<"..var..".")
- line = line:gsub(" %["," "..var.."[")
- line = line:gsub("%(%[","("..var.."[")
- line = line:gsub("{%[","{"..var.."[")
- line = line:gsub("=%[","="..var.."[")
- line = line:gsub("%+%[","+"..var.."[")
- line = line:gsub("%-%[","-"..var.."[")
- line = line:gsub("%*%[","*"..var.."[")
- line = line:gsub("/%[","/"..var.."[")
- line = line:gsub("%^%[","^"..var.."[")
- line = line:gsub("%%%[","%"..var.."[")
- line = line:gsub(">%[",">"..var.."[")
- line = line:gsub("<%[","<"..var.."[")
- line = line:gsub(":%(", "<<_NV_METHOD_DECLARE>>")
- line = line:gsub(" :"," "..var..":")
- line = line:gsub("%(:","("..var..":")
- line = line:gsub("{:","{"..var..":")
- line = line:gsub("=:","="..var..":")
- line = line:gsub("%+:","+"..var..":")
- line = line:gsub("%-:","-"..var..":")
- line = line:gsub("%*:","*"..var..":")
- line = line:gsub("/:","/"..var..":")
- line = line:gsub("%^:","^"..var..":")
- line = line:gsub("%%:","%"..var..":")
- line = line:gsub(">:",">"..var..":")
- line = line:gsub("<:","<"..var..":")
- line = line:gsub("<<_NV_METHOD_DECLARE>>", ":(")
- file_table[n] = line
- if line:match(":%(") then
- local _,brace_f = line:find(":%(")
- n = find_closing_bracket(n, brace_f)
- end
- n=n+1
- end
- local close_brace_line,close_brace_pos = find_closing_brace(i,temp_open_brace_pos)
- local l = file_table[close_brace_line]
- file_table[close_brace_line] = l:sub(1,close_brace_pos-1).." end "..l:sub(close_brace_pos+1)
- end
- end
- end
- table.insert( file_table, 1, "local SCOPE = {len = 0}\n\n\n\n")
- table.insert(file_table, 1, "local _NV_FILE_ = setmetatable({}, {__index = _G})\n _ENV = _NV_FILE_")
- file_table[#file_table+1] = "\n\n\n\nreturn _NV_FILE_"
- for k,v in pairs(file_table) do
- print(v.."\n")
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement