Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 15.09 KB | None | 0 0
  1. io.open("DEBUG.lua",'w'):close() -- clears file
  2. love.graphics.setBackgroundColor(1,0,0)
  3.  
  4. local print = function (...)
  5.     local f = io.open("DEBUG.lua","a+")
  6.     f:write(tostring(...))
  7.     f:close()
  8. end
  9.  
  10.  
  11. local compile_path = "language/test2.txt"
  12.  
  13. local file = [[]]
  14. local new_file = [[]]
  15.  
  16. for line in io.lines(compile_path) do
  17.     file = file..("\n"..line)
  18. end
  19.  
  20. local tools=require("language/tools")
  21. tools.file_table = setmetatable({},{__index = function(t,k) t[k] = '' return t[k] end})
  22. local file_table = tools.file_table
  23.  
  24. local gmatch_sf = tools.gmatch_start_finish --
  25. local find_closing_brace = tools.find_closing_brace
  26. local find_closing_bracket = tools.find_closing_bracket --> ( line_num, bracket_pos )
  27. local find_next_occurance = tools.find_next_occurance --> ( line_number, current_position, pattern )
  28. local find_ending_string = tools.find_ending_string
  29. local adaptive_gmatch_sf = tools.adaptive_gmatch_start_finish
  30.  
  31. local split = function(line, position)
  32.     local l = file_table[line]
  33.     file_table[line] = l:sub(1,position)
  34.     table.insert( file_table, line+1, l:sub(position+1))
  35. end
  36.  
  37. for line in file:gmatch('[^\n]+') do
  38.     file_table[#file_table+1] = line
  39. end
  40.  
  41. local strings = {}
  42. for i,line in pairs(file_table) do
  43.     for s,f in gmatch_sf(line, "'") do
  44.         local l,st,fi = find_next_occurance(i, f, "'")
  45.         local str = line:sub(s,f)
  46.     end
  47. end
  48.  
  49. -- Line breaks for ;;
  50. do
  51.     local i=0
  52.     while #file_table >= i do
  53.         local line = file_table[i]
  54.         local st = line:find(";")
  55.         if st then
  56.             file_table[i] = line:sub(1,st-1)
  57.             table.insert(file_table,i+1, line:sub(st+1))
  58.         end
  59.         i=i+1
  60.     end
  61. end
  62.  
  63. -- Getting rid of lua keywords, extra parsing
  64. do
  65.     for i,line in pairs(file_table) do
  66.         local l
  67.         l=line:gsub("local", "_NV_local")
  68.         l=l:gsub("break","_NV_break")
  69.         l=l:gsub("setmetatable","_NV_setmetatable")
  70.         l=l:gsub("elif", "elseif")
  71.         l=l:gsub("repeat","_NV_repeat")
  72.         l=l:gsub("until","_NV_until")
  73.         l=l:gsub("do","_NV_do")
  74.         l=l:gsub("end","_NV_end")
  75.         l=l:gsub("then","_NV_then")
  76.         l=l:gsub("local","_NV_local")
  77.         l=l:gsub("let","local")
  78.         l=l:gsub("return","_NV_return")
  79.         l=l:gsub("->"," return ")
  80.  
  81.         file_table[i] = l
  82.     end
  83. end
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. local operators = {"+","-","/","^","*","/%/"}
  92.  
  93.  
  94.  
  95. for i,line in ipairs(file_table) do --PARSER
  96.     -- comment parser
  97.     do
  98.         local comment_start = line:find("\\\\")
  99.         if comment_start then
  100.             file_table[i] = line:sub(1,comment_start-1)
  101.         end
  102.     end
  103.     -- Syntax sugar for metamethods.
  104.     do
  105.         local line = file_table[i]
  106.         line = line:gsub("%[%+%]",".__add")
  107.         line = line:gsub("%[%-%]",".__sub")
  108.         line = line:gsub("%[%*%]",".__mul")
  109.         line = line:gsub("%[%/%]",".__div")
  110.         line = line:gsub("%[%/%/%]",".__idiv")
  111.         line = line:gsub("%[%%%]",".__mod")
  112.         line = line:gsub("%[%^%]",".__pow")
  113.         line = line:gsub("%[#%]", ".__len")
  114.         line = line:gsub("%[%?%]",".__index")
  115.         line = line:gsub("%[=%]",".__newindex")
  116.         line = line:gsub("%[%(%)%]",".__call")
  117.         line = line:gsub("%['%]",".__tostring")
  118.         line = line:gsub('%["%]',".__tostring")
  119.         line = line:gsub("%[<%]",".__lt")
  120.         line = line:gsub("%[<=%]",".__le")
  121.         line = line:gsub("%[==%]",".__eq")
  122.         line = line:gsub("%[:k%]",".__mode")
  123.         file_table[i] = line
  124.     end
  125.     -- Syntax sugar allowing +=, -= etc.
  126.     do
  127.         local line = file_table[i]
  128.         for _,v in ipairs(operators) do -- !!!   Enabling +=   !!!
  129.             if line:match("%"..v.."%=") then
  130.                 line = line:gsub("%"..v.."%=", "%=".."%"..v) -- reverses, so now is  =+
  131.                 local var = line:sub(1, line:find("=")-1)
  132.                 line = line:gsub("=", "= "..var)
  133.             end
  134.         end
  135.         file_table[i] = line
  136.     end
  137.     -- Syntax sugar   x ?= y  --->>>   x = x or y
  138.     do
  139.         local line = file_table[i]
  140.         if line:find("?=",1,true) then
  141.             local add_local = line:match("local ") or ""
  142.             local temp = line:gsub("local ","")
  143.             local var = temp:sub(1, temp:find("?")-1)
  144.             line = add_local..var.." = "..var.." or "..line:sub(line:find("?=")+2)
  145.         end
  146.         file_table[i] = line
  147.     end
  148.     -- object parent getting:  obj[@] = t  and t = obj[@]
  149.     do
  150.         local line = file_table[i]
  151.         if line:match("%[@%]") then
  152.             local temp_tabl = {}
  153.             local temp_iter = 1
  154.             for s,f in gmatch_sf(line, "%[@%]") do
  155.                 temp_tabl[temp_iter] = {s,f}
  156.                 temp_iter = temp_iter + 1
  157.             end
  158.             --for s,f in gmatch_sf(line,"%[@%]") do
  159.             for indx=#temp_tabl,1,-1 do
  160.  
  161.                 local s = temp_tabl[indx][1]
  162.                 local f = temp_tabl[indx][2]
  163.                 local eq = line:sub(f+1):match("[^%s^%w^%[^%]]+")
  164.                 if (eq == "=") then
  165.                     local eq_pos = line:find("=")
  166.                     local before_len = #line
  167.                     line = "NVsetmeta("..line:sub(1,s-1)..", "..line:sub(eq_pos+1)..")"
  168.                     local after_len = #line
  169.                     displace = after_len-before_len
  170.                     -- WORKING!
  171.  
  172.                 else -- Will be ~=, ==, etc.
  173.                     line = line:sub(1,s-1).."._NV"..line:sub(f+1)
  174.                 end
  175.             end
  176.         end
  177.         file_table[i] = line
  178.     end
  179.     -- static functions
  180.     do
  181.         local line = file_table[i]
  182.         if line:match("\\%(") then
  183.             for s,f in adaptive_gmatch_sf(i, "\\%(") do
  184.                 local line_num,to_end = find_closing_bracket(i,f)
  185.                 local l = file_table[line_num]
  186.                 file_table[line_num] = l:sub(1,to_end-1).." end) "..l:sub(to_end+1)
  187.                 local line = file_table[i]
  188.                 line = line:sub(1,s-1).." (function "..line:sub(f+1)
  189.                 file_table[i] = line
  190.             end
  191.         end
  192.     end
  193.     -- argless functions
  194.     do
  195.         local line = file_table[i]
  196.         if line:match("!%(") then
  197.             for s,f in adaptive_gmatch_sf(i, "!%(") do
  198.                 local line_num,to_end = find_closing_bracket(i,f)
  199.                 local l = file_table[line_num]
  200.                 file_table[line_num] = l:sub(1,to_end-1).." end) "..l:sub(to_end+1)
  201.                 local line = file_table[i]
  202.                 line = line:sub(1,s-1).." (function()"..line:sub(f+1)
  203.                 file_table[i] = line
  204.             end
  205.         end
  206.     end
  207.     -- ! syntax for argless funcs (and calling argless funcs)
  208.     do
  209.         file_table[i] = file_table[i]:gsub("!","()")
  210.     end
  211.     --  special methods (MAY BE REMOVED)
  212.     do
  213.         --[[
  214.         local line = file_table[i]
  215.         if line:match(":%(") then
  216.             local s,f = line:find(":(",1,true)
  217.             split(i, f)
  218.             local line_num,to_end = find_closing_bracket(i,f)
  219.  
  220.             assert(line_num and to_end)
  221.  
  222.             local l = file_table[line_num]
  223.             file_table[line_num] = l:sub(1,to_end-1).."} end) "..l:sub(to_end+1)
  224.             line = line:sub(1,s-1).." (function "..line:sub(f+1)
  225.             file_table[i] = line
  226.             local li,st = find_next_occurance(i, f+2, "[%(!]")
  227.             local temp = file_table[li]
  228.             local self_var = "_NV_SELF_"..tostring(_NV_COUNTER)
  229.             if temp:sub(st) == "!" then
  230.                 file_table[li] = temp:sub(1,st-1).." ("..self_var..")"..temp:sub(st+1)
  231.             else
  232.                 local have_comma = ""
  233.                 -- Checking if there are user defined arguments inside the method args:
  234.                 local line_arg_br, arg_br = find_closing_bracket(li, st+1)
  235.                 if line_arg_br == i then
  236.                     if temp:sub(st, arg_br):match("%a+") then
  237.                         have_comma = ","
  238.                     end
  239.                 else
  240.                     for _n=li,line_arg_br-1 do
  241.                         if file_table[_n]:match("%a+") then
  242.                             have_comma = ","
  243.                         end
  244.                     end
  245.                     if file_table[line_arg_br]:sub(1,arg_br):match("%a+") then
  246.                         have_comma = ","
  247.                     end
  248.                 end
  249.                 file_table[li] = temp:sub(1,st-1).." ("..self_var..have_comma..temp:sub(st+1)
  250.             end
  251.             _NV_COUNTER = _NV_COUNTER + 1
  252.             table.insert(file_table, li+1,self_var..":{")
  253.         end
  254.         ]]
  255.     end
  256.     --       object assignment syntax.  obj:{  .x = 10  }
  257.     do
  258.         local line = file_table[i]
  259.         if line:match(":{") then
  260.             local _,temp_open_brace_pos = line:find(":{")
  261.             local var = line:sub(1,line:find(":{")-1)
  262.             file_table[i] = " do  "..line:sub(temp_open_brace_pos+1)
  263.             local close_brace_line,close_brace_pos = find_closing_brace(i,temp_open_brace_pos)
  264.  
  265.             -- First iteration is unique. There was no faster way to do this
  266.             --    :/
  267.             -- (Yes, I know it's bad practice and I should use loop yada yada)
  268.  
  269.             do
  270.                 local line = file_table[i]
  271.                 local line_start_char = line:sub(1,1)
  272.                 if line_start_char == "." then
  273.                     line = var..line
  274.                 elseif line_start_char == "[" then
  275.                     line = var..line
  276.                 elseif line_start_char == ":" then
  277.                     line = var..line
  278.                 end
  279.                 line = line:gsub("::",var)
  280.  
  281.                 line = line:gsub(" %.",var..".")
  282.                 line = line:gsub("=%.","="..var..".")
  283.                 line = line:gsub("%(%.","("..var..".")
  284.                 line = line:gsub("{%.","{"..var..".")
  285.                 line = line:gsub("%+%.","+"..var..".")
  286.                 line = line:gsub("%-%.","-"..var..".")
  287.                 line = line:gsub("%*%.","*"..var..".")
  288.                 line = line:gsub("/%.","/"..var..".")
  289.                 line = line:gsub("%^%.","^"..var..".")
  290.                 line = line:gsub("%%%.","%"..var..".")
  291.                 line = line:gsub(">%.",">"..var..".")
  292.                 line = line:gsub("<%.","<"..var..".")
  293.  
  294.                 line = line:gsub(" %[",var.."[")
  295.                 line = line:gsub("%(%[","("..var.."[")
  296.                 line = line:gsub("{%[","{"..var.."[")
  297.                 line = line:gsub("=%[","="..var.."[")
  298.                 line = line:gsub("%+%[","+"..var.."[")
  299.                 line = line:gsub("%-%[","-"..var.."[")
  300.                 line = line:gsub("%*%[","*"..var.."[")
  301.                 line = line:gsub("/%[","/"..var.."[")
  302.                 line = line:gsub("%^%[","^"..var.."[")
  303.                 line = line:gsub("%%%[","%"..var.."[")
  304.                 line = line:gsub(">%[",">"..var.."[")
  305.                 line = line:gsub("<%[","<"..var.."[")
  306.  
  307.                 line = line:gsub(" :",var..":")
  308.                 line = line:gsub("%(:","("..var..":")
  309.                 line = line:gsub("{:","{"..var..":")
  310.                 line = line:gsub("=:","="..var..":")
  311.                 line = line:gsub("%+:","+"..var..":")
  312.                 line = line:gsub("%-:","-"..var..":")
  313.                 line = line:gsub("%*:","*"..var..":")
  314.                 line = line:gsub("/:","/"..var..":")
  315.                 line = line:gsub("%^:","^"..var..":")
  316.                 line = line:gsub("%%:","%"..var..":")
  317.                 line = line:gsub(">:",">"..var..":")
  318.                 line = line:gsub("<:","<"..var..":")
  319.                 file_table[i] = line
  320.             end
  321.  
  322.             local n = i+1
  323.  
  324.             while n<=close_brace_line do
  325.                 line = file_table[n]
  326.  
  327.                 local line_start_char = line:sub(1,2)
  328.  
  329.                 if line_start_char:sub(1,1) == "." then
  330.                     line = var..line
  331.                 elseif line_start_char:sub(1,1) == "[" then
  332.                     line = var..line
  333.                 elseif line_start_char == "::" then
  334.                     line = var..line:sub(3)
  335.                 elseif line_start_char:sub(1,1) == ":" then
  336.                     line = var..line
  337.                 end
  338.                 line = line:gsub("::",var)
  339.  
  340.                 line = line:gsub(" %."," "..var..".")
  341.                 line = line:gsub("=%.","="..var..".")
  342.                 line = line:gsub("%(%.","("..var..".")
  343.                 line = line:gsub("{%.","{"..var..".")
  344.                 line = line:gsub("%+%.","+"..var..".")
  345.                 line = line:gsub("%-%.","-"..var..".")
  346.                 line = line:gsub("%*%.","*"..var..".")
  347.                 line = line:gsub("/%.","/"..var..".")
  348.                 line = line:gsub("%^%.","^"..var..".")
  349.                 line = line:gsub("%%%.","%"..var..".")
  350.                 line = line:gsub(">%.",">"..var..".")
  351.                 line = line:gsub("<%.","<"..var..".")
  352.  
  353.                 line = line:gsub(" %["," "..var.."[")
  354.                 line = line:gsub("%(%[","("..var.."[")
  355.                 line = line:gsub("{%[","{"..var.."[")
  356.                 line = line:gsub("=%[","="..var.."[")
  357.                 line = line:gsub("%+%[","+"..var.."[")
  358.                 line = line:gsub("%-%[","-"..var.."[")
  359.                 line = line:gsub("%*%[","*"..var.."[")
  360.                 line = line:gsub("/%[","/"..var.."[")
  361.                 line = line:gsub("%^%[","^"..var.."[")
  362.                 line = line:gsub("%%%[","%"..var.."[")
  363.                 line = line:gsub(">%[",">"..var.."[")
  364.                 line = line:gsub("<%[","<"..var.."[")
  365.  
  366.                 line = line:gsub(":%(", "<<_NV_METHOD_DECLARE>>")
  367.                 line = line:gsub(" :"," "..var..":")
  368.                 line = line:gsub("%(:","("..var..":")
  369.                 line = line:gsub("{:","{"..var..":")
  370.                 line = line:gsub("=:","="..var..":")
  371.                 line = line:gsub("%+:","+"..var..":")
  372.                 line = line:gsub("%-:","-"..var..":")
  373.                 line = line:gsub("%*:","*"..var..":")
  374.                 line = line:gsub("/:","/"..var..":")
  375.                 line = line:gsub("%^:","^"..var..":")
  376.                 line = line:gsub("%%:","%"..var..":")
  377.                 line = line:gsub(">:",">"..var..":")
  378.                 line = line:gsub("<:","<"..var..":")
  379.                 line = line:gsub("<<_NV_METHOD_DECLARE>>", ":(")
  380.                 file_table[n] = line
  381.  
  382.                 if line:match(":%(") then
  383.                     local _,brace_f = line:find(":%(")
  384.                     n = find_closing_bracket(n, brace_f)
  385.                 end
  386.  
  387.                 n=n+1
  388.             end
  389.             local close_brace_line,close_brace_pos = find_closing_brace(i,temp_open_brace_pos)
  390.             local l = file_table[close_brace_line]
  391.             file_table[close_brace_line] = l:sub(1,close_brace_pos-1).." end "..l:sub(close_brace_pos+1)
  392.  
  393.         end
  394.     end
  395.  
  396. end
  397.  
  398. table.insert( file_table, 1, "local SCOPE = {len = 0}\n\n\n\n")
  399. table.insert(file_table, 1, "local _NV_FILE_ = setmetatable({}, {__index = _G})\n _ENV = _NV_FILE_")
  400. file_table[#file_table+1] = "\n\n\n\nreturn _NV_FILE_"
  401.  
  402.  
  403. for k,v in pairs(file_table) do
  404.     print(v.."\n")
  405. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement