Advertisement
Lanzr

HexCompiler

Jun 15th, 2024 (edited)
534
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.77 KB | None | 0 0
  1. --[[
  2.     * a  mineCraft HexCasting Mod Compiler, can compile the hCode in game and output to the focus
  3.     * need mod : Ducky peripheral
  4.     * author : Lanzr
  5. ]]
  6. local path = arg[1]
  7. if(path == nil) then
  8.     print("#param 1 : filePath")
  9.     return
  10. end
  11. if(fs.exists(path) == false) then
  12.     print("file "..path.." is not exist!")
  13.     return
  14. end
  15.  
  16. local inf = io.open(path,"r") -- the source_code filename
  17. local codeStr = inf.read(inf,"*all")
  18. inf.close(inf)
  19.  
  20. local fPort = peripheral.find("focal_port")
  21.  
  22. local lastIndex = 0
  23. local index = -1
  24. local leftBrackIndex = nil
  25.  
  26. local hexlist = {} -- the final table use to output
  27.  
  28. local funcKey = nil
  29. local funcMap = {}
  30.  
  31. function genRegex(str) return "^[\t ]*"..str.."[\t ]*$" end
  32.  
  33. local preMap = {
  34.     ["include"] = genRegex("@include[ ]+([%w_]+)"),
  35.     ["func"] = genRegex("@func[ ]+([%w_]+)"),
  36. }
  37. local hexMap = { -- add pattern table to this table
  38.     ["me"] = {["startDir"]="EAST",["angles"]="qaq"},
  39.     ["{"] = {["startDir"]="WEST",["angles"]="qqq"},
  40.     ["}"] = {["startDir"]="EAST",["angles"]="eee"},
  41.     ["pos"] = {["startDir"]="EAST",["angles"]="aa"},
  42.     ["sight"] = {["startDir"]="EAST",["angles"]="wa"},
  43.     ["unpack"] = {["startDir"]="NORTH_WEST",["angles"]="qwaeawq"},
  44.     ["+"] = {["startDir"]="NORTH_EAST",["angles"]="waaw"},
  45.     ["-"] = {["startDir"]="NORTH_WEST",["angles"]="wddw"},
  46.     ["*"] = {["startDir"]="SOUTH_EAST",["angles"]="waqaw"},
  47.     ["dig"] = {["startDir"]="EAST",["angles"]="qaqqqqq"},
  48.     ["get_block"] = {["startDir"]="EAST",["angles"]="wqaawdd"},
  49. }
  50.  
  51. local NumMap = {
  52.     [0] = {["startDir"]="SOUTH_EAST",["angles"]="aqaa"},
  53.     ["+1"] = (function () return "w" end),
  54.     ["*2"] = (function () return "a" end)
  55. }
  56.  
  57. local regMap = {
  58.     [genRegex("([{}>%*%+-=<])")] = (function (cStr)
  59.         table.insert(hexlist,hexMap[cStr])
  60.     return true end),
  61.     [genRegex("rm[ ]+(%d+)")] = (function (cStr)
  62.         addRMPattern(cStr)
  63.     return true end),
  64.     [genRegex("(-?[%d]+)")] = (function (cStr)
  65.         addNumPattern(tonumber(cStr))
  66.     return true end),
  67.     [genRegex("([%a_]+[%w_]*)")] = (function (cStr)
  68.         local t = hexMap[cStr]
  69.         if t == nil then
  70.             return false
  71.         end
  72.         table.insert(hexlist,t)
  73.     return true end),
  74.     [genRegex("([%a_]+[%w_]*)%(%)")] = (function (cStr)
  75.         parseStr(funcMap[cStr])
  76.     return true end)
  77. }
  78.  
  79. function addNumPattern(num)
  80.     local numPattern = {}
  81.     local opers = {}
  82.     local size = 0
  83.     local rem = num > 0 and num or -num
  84.     local numStr = "aqaa"
  85.     numPattern["startDir"] = "SOUTH_EAST"
  86.     repeat
  87.         if rem % 2 == 0 then
  88.             table.insert(opers, "*2")
  89.             rem = rem / 2
  90.         else
  91.             table.insert(opers,"+1")
  92.             rem = rem -1
  93.         end
  94.         size = size +1
  95.     until  rem < 1  
  96.     for i = size, 1, -1 do
  97.         numStr = numStr..NumMap[opers[i]]()
  98.     end
  99.     numPattern["angles"] = numStr
  100.     if num < 0 then
  101.         table.insert(hexlist,NumMap[0])
  102.         table.insert(hexlist,numPattern)
  103.         table.insert(hexlist,hexMap["-"])
  104.     else
  105.         table.insert(hexlist,numPattern)
  106.     end
  107. end
  108.  
  109. function addRMPattern(rmPos)
  110.     local rmPattern = {}
  111.     local angleStr = ""
  112.     local pos = tonumber(rmPos)
  113.     rmPattern["startDir"] = "EAST"
  114.     if (pos > 1) then
  115.         for i=1,pos-1,1 do
  116.             angleStr = angleStr.."w"
  117.         end
  118.         angleStr = angleStr.."ea"
  119.     else
  120.         angleStr = "a"
  121.     end
  122.     rmPattern["angles"] = angleStr
  123.     table.insert(hexlist,rmPattern)
  124. end
  125.  
  126. function parseStr(str)
  127.     local lastIndex = 0
  128.     local index = -1
  129.     local cut = ""
  130.     local lineIndex = 0
  131.     while ( index ~= nil) do
  132.         local syntaxFlag = true;
  133.         lineIndex = lineIndex + 1
  134.         index = string.find(str,"\n", index + 1);
  135.         if( index ~= nil) then
  136.             cut = string.sub(str,lastIndex+1, index-1)
  137.         else
  138.             cut = string.sub(str,lastIndex+1, index);
  139.         end
  140.         -- comment check
  141.         repeat
  142.             lastIndex = index
  143.             local commentPos = string.find(cut,"#")
  144.             if commentPos ~= nil then
  145.                 cut = string.sub(cut, 1,commentPos-1)
  146.             end
  147.             -- preExp regMap
  148.             -- include check
  149.             if (string.match(cut,preMap["include"])) then
  150.                 local cStr = string.match(cut,preMap["include"])
  151.                 local inf = io.open(cStr,"r") -- the source_code filename
  152.                 local subStr = inf.read(inf,"*all")
  153.                 inf.close(inf)
  154.                 parseStr(subStr)
  155.                 break
  156.             end
  157.             -- func check
  158.             if (string.match(cut,genRegex("@func[ ]+([%w_]+)"))~= nil) then
  159.                 local cStr = string.match(cut,preMap["func"])
  160.                 funcMap[cStr] = ""
  161.                 funcKey = cStr
  162.                 break
  163.             elseif(string.match(cut,genRegex("@end"))) then
  164.                 funcKey = nil
  165.                 break
  166.             else
  167.                 if(funcKey ~= nil) then
  168.                     funcMap[funcKey] = funcMap[funcKey]..cut.."\n"
  169.                     break
  170.                 end
  171.             end
  172.             -- common regMap
  173.             for key, cb in pairs(regMap) do
  174.                 if (string.match(cut,key)~= nil) then
  175.                     local cStr = string.match(cut,key)
  176.                     syntaxFlag = cb(cStr)
  177.                     break
  178.                 end  
  179.             end
  180.         until true
  181.         if syntaxFlag ~= true then
  182.             print("Line "..lineIndex.." : "..cut.." is illegal syntax")
  183.         end
  184.     end
  185.  
  186.     -- out put final hexlist    
  187.     if(fPort ~= nil) then
  188.         fPort.writeIota(hexlist)
  189.         return
  190.     end
  191. end
  192.  
  193. function mainloop()
  194.     parseStr(codeStr)
  195.  end
  196.  mainloop()
  197.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement