DrawingJhon

Obfuscator

Jan 17th, 2021 (edited)
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 40.68 KB | None | 0 0
  1. do
  2.     local RealGame = game
  3.     game = newproxy(true)
  4.     local FakeServices = {
  5.         CoreGui = owner.PlayerGui
  6.     }
  7.     local NameServices = {"findService";"FindService";"GetService";"getService";"service";"Service"}
  8.     local meta = getmetatable(game)
  9.     meta.__index = function(self, index)
  10.         local service = FakeServices[index]
  11.         if service then
  12.             return service
  13.         end
  14.         local found = table.find(NameServices, index)
  15.         if found then
  16.             return function(self, name)
  17.                 if FakeServices[name] then
  18.                     return FakeServices[name]
  19.                 end
  20.                 return RealGame:GetService(name)
  21.             end
  22.         end
  23.         if type(RealGame[index]) == "function" then
  24.             return function(self, ...)
  25.                 return RealGame[index](RealGame, ...)
  26.             end
  27.         end
  28.         return RealGame[index]
  29.     end
  30.     meta.__newindex = function(self, index, value)
  31.         local index = index == game and RealGame
  32.         local value = value == game and RealGame
  33.         RealGame[index] = value
  34.     end
  35.     meta.__tostring = function(self)
  36.         return tostring(RealGame)
  37.     end
  38.     meta.__metatable = "The metatable is locked"
  39.     function PluginManager()
  40.         local tab = {
  41.             CreatePlugin = function(self)
  42.                 local tabe = {
  43.                     CreateToolbar = function(self, name)
  44.                         local sgui = Instance.new("ScreenGui", owner.PlayerGui)
  45.                         sgui.Name = name
  46.                         return {CreateButton = function(self, name, text, idk)
  47.                             local button = Instance.new("TextButton", sgui)
  48.                             button.Size = UDim2.new(0, 300, 0, 300)
  49.                             button.Position = UDim2.new(1, -300, 0, 0)
  50.                             button.Name = name
  51.                             button.Text = text
  52.                             return setmetatable({Click = button.MouseButton1Click}, {
  53.                                 __index = function(self, index)
  54.                                     return button[index]
  55.                                 end;
  56.                                 __newindex = function(self, index, value)
  57.                                     button[index] = value
  58.                                 end;
  59.                                 __tostring = function(self)
  60.                                     return tostring(button)
  61.                                 end;
  62.                                 __metatable = "The metatable is locked";
  63.                             })
  64.                         end}
  65.                     end
  66.                 }
  67.                 return tabe
  68.             end
  69.         }
  70.         return tab
  71.     end
  72. end
  73.  
  74. local ac = PluginManager():CreatePlugin()
  75. local bc = ac:CreateToolbar("Obfuscate")
  76. local cc = bc:CreateButton("Obfuscate", "Obfuscate", "")
  77. local dc = false
  78. ObfuscatorGUI = Instance.new("ScreenGui", game:GetService("CoreGui"))
  79. ObfuscatorGUI.Name = "ObfuscatorGUI"
  80. MainFrame = Instance.new("Frame", ObfuscatorGUI)
  81. MainFrame.Name = "MainFrame"
  82. MainFrame.BackgroundColor3 = Color3.new(0 / 255, 0 / 255, 0 / 255)
  83. MainFrame.BorderSizePixel = 0;
  84. MainFrame.BackgroundTransparency = 0.3;
  85. MainFrame.Position = UDim2.new(.5, -150, 0.5, -100)
  86. MainFrame.Size = UDim2.new(0, 300, 0, 200)
  87. MainFrame.Visible = false
  88. Confirm = Instance.new("TextButton", MainFrame)
  89. Confirm.Name = "Confirm"
  90. Confirm.BackgroundColor3 = Color3.new(133 / 255, 255 / 255, 124 / 255)
  91. Confirm.BorderSizePixel = 0;
  92. Confirm.Font = "SourceSans"
  93. Confirm.BackgroundTransparency = 0.2;
  94. Confirm.Position = UDim2.new(0, 10, 1, -40)
  95. Confirm.Size = UDim2.new(0, 130, 0, 30)
  96. Confirm.TextColor3 = Color3.new(0, 0, 0)
  97. Confirm.FontSize = "Size18"
  98. Confirm.Text = "Confirm"
  99. Confirm.Visible = true
  100. Cancel = Instance.new("TextButton", MainFrame)
  101. Cancel.Name = "Cancel"
  102. Cancel.Font = "SourceSans"
  103. Cancel.BackgroundColor3 = Color3.new(255 / 255, 126 / 255, 126 / 255)
  104. Cancel.BorderSizePixel = 0;
  105. Cancel.BackgroundTransparency = 0.2
  106. Cancel.Position = UDim2.new(1, -140, 1, -40)
  107. Cancel.Size = UDim2.new(0, 130, 0, 30)
  108. Cancel.TextColor3 = Color3.new(0, 0, 0)
  109. Cancel.FontSize = "Size18"
  110. Cancel.Text = "Cancel"
  111. Cancel.Visible = true
  112. Txt = Instance.new("TextLabel", MainFrame)
  113. Txt.Name = "Text"
  114. Txt.Font = "SourceSans"
  115. Txt.BackgroundColor3 = Color3.new(255 / 255, 255 / 255, 255 / 255)
  116. Txt.BackgroundTransparency = 0.8;
  117. Txt.BorderSizePixel = 0
  118. Txt.Position = UDim2.new(0, 10, 0, 10)
  119. Txt.Size = UDim2.new(1, -20, 0, 140)
  120. Txt.Visible = true
  121. Txt.FontSize = "Size24"
  122. Txt.Text = "You are about to obfuscate ALL the scripts in this place, obfuscation is  NOT REVERSIBLE, are you sure you want to do this?"
  123. Txt.TextColor3 = Color3.new(255 / 255, 255 / 255, 255 / 255)
  124. Txt.TextWrapped = true;
  125. Txt.TextXAlignment = "Center"
  126. Txt.TextYAlignment = "Top"
  127. Txt.TextStrokeTransparency = 0.9;
  128. Txt2 = Instance.new("TextLabel", MainFrame)
  129. Txt2.Name = "Text2"
  130. Txt2.Font = "SourceSans"
  131. Txt2.BorderSizePixel = 0;
  132. Txt2.FontSize = "Size14"
  133. Txt2.TextColor3 = Color3.new(0 / 255, 0 / 255, 0 / 255)
  134. Txt2.Text = string.reverse("noitaropaV yb detaerC")
  135. Txt2.TextTransparency = 0.7;
  136. Txt2.Visible = true
  137. Txt2.Position = UDim2.new(1, -20, 0, 140)
  138. Txt2.Size = UDim2.new(0, 0, 0, 0)
  139. Txt2.TextXAlignment = "Right"
  140. Confirm.MouseButton1Click:connect(function(aaa, baa)
  141.     Search(game:GetService("Workspace"))
  142.     Search(game:GetService("Players"))
  143.     Search(game:GetService("Lighting"))
  144.     Search(game:GetService("ReplicatedStorage"))
  145.     Search(game:GetService("ServerScriptService"))
  146.     Search(game:GetService("ServerStorage"))
  147.     Search(game:GetService("StarterGui"))
  148.     Search(game:GetService("StarterPack"))
  149.     Search(game:GetService("Debris"))
  150.     Search(game:GetService("Teams"))
  151.     Search(game:GetService("SoundService"))
  152.     MainFrame.Visible = false;
  153.     dc = false
  154.     print("OBFUSCATOR: All the scripts had been obfuscated.")
  155. end)
  156. Cancel.MouseButton1Click:connect(function(aaa, baa)
  157.     dc = false;
  158.     MainFrame.Visible = false
  159. end)
  160. cc.Click:connect(function()
  161.     if dc == true then
  162.         dc = false;
  163.         MainFrame.Visible = false
  164.     elseif dc == false then
  165.         dc = true
  166.         MainFrame.Visible = true
  167.     end
  168. end)
  169. function Search(aaa)
  170.     for baa, caa in pairs(aaa:GetChildren()) do
  171.         if caa.ClassName == "Script" or
  172.         caa.ClassName == "LocalScript" then
  173.             if caa.LinkedSource ~= '' then
  174.                 spawn(function()
  175.                     error("OBFUSCATOR: Unable to obfuscate scripts with LinkedSources.", 0)
  176.                 end)
  177.                 return
  178.             end
  179.             local daa, _ba = _G.Minify(caa.Source)
  180.             if daa then
  181.                 caa.Source = _ba
  182.             else
  183.                 spawn(function()
  184.                     error("OBFUSCATOR: ".._ba, 0)
  185.                 end)
  186.                 return
  187.             end
  188.         else
  189.             Search(caa)
  190.         end
  191.     end
  192. end
  193. function lookupify(aaa)
  194.     for baa, caa in pairs(aaa) do
  195.         aaa[caa] = true
  196.     end;
  197.     return aaa
  198. end
  199. function CountTable(aaa)
  200.     local baa = 0;
  201.     for caa in pairs(aaa) do
  202.         baa = baa + 1
  203.     end;
  204.     return baa
  205. end
  206. function PrintTable(aaa, baa)
  207.     if aaa.Print then
  208.         return aaa.Print()
  209.     end;
  210.     baa = baa or 0;
  211.     local caa = (CountTable(aaa) > 1)
  212.     local daa = string.rep('    ', baa + 1)
  213.     local _ba = "{".. (caa and '\n' or '')
  214.     for aba, bba in pairs(aaa) do
  215.         if type(bba) ~= 'function' then
  216.             _ba = _ba.. (caa and daa or '')
  217.             if type(aba) == 'number' then
  218.             elseif type(aba) == 'string' and aba:match("^[A-Za-z_][A-Za-z0-9_]*$") then
  219.                 _ba = _ba..aba.." = "
  220.             elseif type(aba) == 'string' then
  221.                 _ba = _ba.."[\""..aba.."\"] = "
  222.             else
  223.                 _ba = _ba.."["..tostring(aba).."] = "
  224.             end
  225.             if type(bba) == 'string' then
  226.                 _ba = _ba.."\""..bba.."\""
  227.             elseif type(bba) == 'number' then
  228.                 _ba = _ba..bba
  229.             elseif type(bba) == 'table' then
  230.                 _ba = _ba..PrintTable(bba, baa + (caa and 1 or 0))
  231.             else
  232.                 _ba = _ba..tostring(bba)
  233.             end;
  234.             if next(aaa, aba) then
  235.                 _ba = _ba..","
  236.             end
  237.             if caa then
  238.                 _ba = _ba..'\n'
  239.             end
  240.         end
  241.     end;
  242.     _ba = _ba..(caa and string.rep('    ', baa) or '').."}"
  243.     return _ba
  244. end;
  245. local _d = lookupify{
  246.     ' ',
  247.     '\n',
  248.     '\t',
  249.     '\r'
  250. }
  251. local ad = {
  252.     ['\r'] = '\\r',
  253.     ['\n'] = '\\n',
  254.     ['\t'] = '\\t',
  255.     ['"'] = '\\"',
  256.     ["'"] = "\\'"
  257. }
  258. local bd = lookupify{
  259.     'a',
  260.     'b',
  261.     'c',
  262.     'd',
  263.     'e',
  264.     'f',
  265.     'g',
  266.     'h',
  267.     'i',
  268.     'j',
  269.     'k',
  270.     'l',
  271.     'm',
  272.     'n',
  273.     'o',
  274.     'p',
  275.     'q',
  276.     'r',
  277.     's',
  278.     't',
  279.     'u',
  280.     'v',
  281.     'w',
  282.     'x',
  283.     'y',
  284.     'z'
  285. }
  286. local cd = lookupify{
  287.     'A',
  288.     'B',
  289.     'C',
  290.     'D',
  291.     'E',
  292.     'F',
  293.     'G',
  294.     'H',
  295.     'I',
  296.     'J',
  297.     'K',
  298.     'L',
  299.     'M',
  300.     'N',
  301.     'O',
  302.     'P',
  303.     'Q',
  304.     'R',
  305.     'S',
  306.     'T',
  307.     'U',
  308.     'V',
  309.     'W',
  310.     'X',
  311.     'Y',
  312.     'Z'
  313. }
  314. local dd = lookupify{
  315.     '0',
  316.     '1',
  317.     '2',
  318.     '3',
  319.     '4',
  320.     '5',
  321.     '6',
  322.     '7',
  323.     '8',
  324.     '9'
  325. }
  326. local __a = lookupify{
  327.     '0',
  328.     '1',
  329.     '2',
  330.     '3',
  331.     '4',
  332.     '5',
  333.     '6',
  334.     '7',
  335.     '8',
  336.     '9',
  337.     'A',
  338.     'a',
  339.     'B',
  340.     'b',
  341.     'C',
  342.     'c',
  343.     'D',
  344.     'd',
  345.     'E',
  346.     'e',
  347.     'F',
  348.     'f'
  349. }
  350. local a_a = lookupify{
  351.     '+',
  352.     '-',
  353.     '*',
  354.     '/',
  355.     '^',
  356.     '%',
  357.     ',',
  358.     '{',
  359.     '}',
  360.     '[',
  361.     ']',
  362.     '(',
  363.     ')',
  364.     ';',
  365.     '#'
  366. }
  367. local b_a = lookupify{
  368.     'and',
  369.     'break',
  370.     'do',
  371.     'else',
  372.     'elseif',
  373.     'end',
  374.     'false',
  375.     'for',
  376.     'function',
  377.     'goto',
  378.     'if',
  379.     'in',
  380.     'local',
  381.     'nil',
  382.     'not',
  383.     'or',
  384.     'repeat',
  385.     'return',
  386.     'then',
  387.     'true',
  388.     'until',
  389.     'while'
  390. }
  391. function LexLua(aaa)
  392.     local baa = {}
  393.     local caa, daa = pcall(function()
  394.         local cba = 1;
  395.         local dba = 1;
  396.         local _ca = 1
  397.         local function aca()
  398.             local ada = aaa:sub(cba, cba)
  399.             if ada == '\n' then
  400.                 _ca = 1;
  401.                 dba = dba + 1
  402.             else
  403.                 _ca = _ca + 1
  404.             end;
  405.             cba = cba + 1;
  406.             return ada
  407.         end
  408.         local function bca(ada)
  409.             ada = ada or 0;
  410.             return aaa:sub(cba + ada, cba + ada)
  411.         end;
  412.         local function cca(ada)
  413.             local bda = bca()
  414.             for i = 1, #ada do
  415.                 if bda == ada:sub(i, i) then
  416.                     return aca()
  417.                 end
  418.             end
  419.         end;
  420.         local function dca(ada)
  421.             return error(">> :"..dba..":".._ca..": "..ada, 0)
  422.         end
  423.         local function _da()
  424.             local ada = cba
  425.             if bca() == '[' then
  426.                 local bda = 0;
  427.                 while bca(bda + 1) == '=' do
  428.                     bda = bda + 1
  429.                 end
  430.                 if bca(bda + 1) == '[' then
  431.                     for _ = 0, bda + 1 do
  432.                         aca()
  433.                     end
  434.                     local cda = cba
  435.                     while true do
  436.                         if bca() == '' then
  437.                             dca("Expected `]"..string.rep('=', bda).."]` near <eof>.", 3)
  438.                         end;
  439.                         local a_b = true;
  440.                         if bca() == ']' then
  441.                             for i = 1, bda do
  442.                                 if bca(i) ~= '=' then
  443.                                     a_b = false
  444.                                 end
  445.                             end
  446.                             if bca(bda + 1) ~= ']' then
  447.                                 a_b = false
  448.                             end
  449.                         else
  450.                             a_b = false
  451.                         end;
  452.                         if a_b then
  453.                             break
  454.                         else
  455.                             aca()
  456.                         end
  457.                     end;
  458.                     local dda = aaa:sub(cda, cba - 1)
  459.                     for i = 0, bda + 1 do
  460.                         aca()
  461.                     end
  462.                     local __b = aaa:sub(ada, cba - 1)
  463.                     return dda, __b
  464.                 else
  465.                     return nil
  466.                 end
  467.             else
  468.                 return nil
  469.             end
  470.         end
  471.         while true do
  472.             local ada = ''
  473.             while true do
  474.                 local b_b = bca()
  475.                 if _d[b_b] then
  476.                     ada = ada..aca()
  477.                 elseif b_b == '-' and bca(1) == '-' then
  478.                     aca()
  479.                     aca()
  480.                     ada = ada..'--'
  481.                     local c_b, d_b = _da()
  482.                     if d_b then
  483.                         ada = ada..d_b
  484.                     else
  485.                         while bca() ~= '\n' and bca() ~= '' do
  486.                             ada = ada..aca()
  487.                         end
  488.                     end
  489.                 else
  490.                     break
  491.                 end
  492.             end;
  493.             local bda = dba;
  494.             local cda = _ca
  495.             local dda = ":"..dba..":".._ca..":> "
  496.             local __b = bca()
  497.             local a_b = nil
  498.             if __b == '' then
  499.                 a_b = {
  500.                     Type = 'Eof'
  501.                 }
  502.             elseif cd[__b] or bd[__b] or __b == '_' then
  503.                 local b_b = cba;
  504.                 repeat
  505.                     aca()
  506.                     __b = bca()
  507.                 until not(cd[__b] or bd[__b] or dd[__b] or __b == '_')
  508.                 local c_b = aaa:sub(b_b, cba - 1)
  509.                 if b_a[c_b] then
  510.                     a_b = {
  511.                         Type = 'Keyword',
  512.                         Data = c_b
  513.                     }
  514.                 else
  515.                     a_b = {
  516.                         Type = 'Ident',
  517.                         Data = c_b
  518.                     }
  519.                 end
  520.             elseif dd[__b] or (bca() == '.' and dd[bca(1)]) then
  521.                 local b_b = cba
  522.                 if __b == '0' and bca(1) == 'x' then
  523.                     aca()
  524.                     aca()
  525.                     while __a[bca()] do
  526.                         aca()
  527.                     end;
  528.                     if cca('Pp') then
  529.                         cca('+-')
  530.                         while dd[bca()] do
  531.                             aca()
  532.                         end
  533.                     end
  534.                 else
  535.                     while dd[bca()] do
  536.                         aca()
  537.                     end;
  538.                     if cca('.') then
  539.                         while dd[bca()] do
  540.                             aca()
  541.                         end
  542.                     end;
  543.                     if cca('Ee') then
  544.                         cca('+-')
  545.                         while dd[bca()] do
  546.                             aca()
  547.                         end
  548.                     end
  549.                 end;
  550.                 a_b = {
  551.                     Type = 'Number',
  552.                     Data = aaa:sub(b_b, cba - 1)
  553.                 }
  554.             elseif __b == '\'' or __b == '\"' then
  555.                 local b_b = cba;
  556.                 local c_b = aca()
  557.                 local d_b = cba;
  558.                 while true do
  559.                     local bab = aca()
  560.                     if bab == '\\' then
  561.                         aca()
  562.                     elseif bab == c_b then
  563.                         break
  564.                     elseif bab == '' then
  565.                         dca("Unfinished string near <eof>")
  566.                     end
  567.                 end;
  568.                 local _ab = aaa:sub(d_b, cba - 2)
  569.                 local aab = aaa:sub(b_b, cba - 1)
  570.                 a_b = {
  571.                     Type = 'String',
  572.                     Data = aab,
  573.                     Constant = _ab
  574.                 }
  575.             elseif __b == '[' then
  576.                 local b_b, c_b = _da()
  577.                 if c_b then
  578.                     a_b = {
  579.                         Type = 'String',
  580.                         Data = c_b,
  581.                         Constant = b_b
  582.                     }
  583.                 else
  584.                     aca()
  585.                     a_b = {
  586.                         Type = 'Symbol',
  587.                         Data = '['
  588.                     }
  589.                 end
  590.             elseif cca('>=<') then
  591.                 if cca('=') then
  592.                     a_b = {
  593.                         Type = 'Symbol',
  594.                         Data = __b..'='
  595.                     }
  596.                 else
  597.                     a_b = {
  598.                         Type = 'Symbol',
  599.                         Data = __b
  600.                     }
  601.                 end
  602.             elseif cca('~') then
  603.                 if cca('=') then
  604.                     a_b = {
  605.                         Type = 'Symbol',
  606.                         Data = '~='
  607.                     }
  608.                 else
  609.                     dca("Unexpected symbol `~` in source.", 2)
  610.                 end
  611.             elseif cca('.') then
  612.                 if cca('.') then
  613.                     if cca('.') then
  614.                         a_b = {
  615.                             Type = 'Symbol',
  616.                             Data = '...'
  617.                         }
  618.                     else
  619.                         a_b = {
  620.                             Type = 'Symbol',
  621.                             Data = '..'
  622.                         }
  623.                     end
  624.                 else
  625.                     a_b = {
  626.                         Type = 'Symbol',
  627.                         Data = '.'
  628.                     }
  629.                 end
  630.             elseif cca(':') then
  631.                 if cca(':') then
  632.                     a_b = {
  633.                         Type = 'Symbol',
  634.                         Data = '::'
  635.                     }
  636.                 else
  637.                     a_b = {
  638.                         Type = 'Symbol',
  639.                         Data = ':'
  640.                     }
  641.                 end
  642.             elseif a_a[__b] then
  643.                 aca()
  644.                 a_b = {
  645.                     Type = 'Symbol',
  646.                     Data = __b
  647.                 }
  648.             else
  649.                 local b_b, c_b = _da()
  650.                 if b_b then
  651.                     a_b = {
  652.                         Type = 'String',
  653.                         Data = c_b,
  654.                         Constant = b_b
  655.                     }
  656.                 else
  657.                     dca("Unexpected Symbol `"..__b.."` in source.", 2)
  658.                 end
  659.             end;
  660.             a_b.LeadingWhite = ada;
  661.             a_b.Line = bda;
  662.             a_b.Char = cda
  663.             a_b.Print = function()
  664.                 return "<".. (a_b.Type..string.rep(' ', 7 - #a_b.Type)).."  ".. (a_b.Data or '').." >"
  665.             end;
  666.             baa[#baa + 1] = a_b;
  667.             if a_b.Type == 'Eof' then
  668.                 break
  669.             end
  670.         end
  671.     end)
  672.     if not caa then
  673.         return false, daa
  674.     end;
  675.     local _ba = {}
  676.     local aba = {}
  677.     local bba = 1
  678.     function _ba:Peek(cba)
  679.         cba = cba or 0;
  680.         return baa[math.min(#baa, bba + cba)]
  681.     end
  682.     function _ba:Get()
  683.         local cba = baa[bba]
  684.         bba = math.min(bba + 1, #baa)
  685.         return cba
  686.     end;
  687.     function _ba:Is(cba)
  688.         return _ba:Peek().Type == cba
  689.     end;
  690.     function _ba:Save()
  691.         aba[#aba + 1] = bba
  692.     end
  693.     function _ba:Commit()
  694.         aba[#aba] = nil
  695.     end;
  696.     function _ba:Restore()
  697.         bba = aba[#aba]
  698.         aba[#aba] = nil
  699.     end
  700.     function _ba:ConsumeSymbol(cba)
  701.         local dba = self:Peek()
  702.         if dba.Type == 'Symbol' then
  703.             if cba then
  704.                 if dba.Data == cba then
  705.                     self:Get()
  706.                     return true
  707.                 else
  708.                     return nil
  709.                 end
  710.             else
  711.                 self:Get()
  712.                 return dba
  713.             end
  714.         else
  715.             return nil
  716.         end
  717.     end
  718.     function _ba:ConsumeKeyword(cba)
  719.         local dba = self:Peek()
  720.         if dba.Type == 'Keyword' and dba.Data == cba then
  721.             self:Get()
  722.             return true
  723.         else
  724.             return nil
  725.         end
  726.     end;
  727.     function _ba:IsKeyword(cba)
  728.         local dba = _ba:Peek()
  729.         return dba.Type == 'Keyword' and dba.Data == cba
  730.     end
  731.     function _ba:IsSymbol(cba)
  732.         local dba = _ba:Peek()
  733.         return dba.Type == 'Symbol' and dba.Data == cba
  734.     end
  735.     function _ba:IsEof()
  736.         return _ba:Peek().Type == 'Eof'
  737.     end;
  738.     return true, _ba
  739. end
  740. function ParseLua(aaa)
  741.     local baa, caa = LexLua(aaa)
  742.     if not baa then
  743.         return false, caa
  744.     end
  745.     local function daa(d_b)
  746.         local _ab = ">> :"..caa:Peek().Line..":"..caa:Peek().Char..": "..d_b.."\n"
  747.         local aab = 0
  748.         for bab in aaa:gmatch("[^\n]*\n?") do
  749.             if bab:sub(-1, -1) == '\n' then
  750.                 bab = bab:sub(1, -2)
  751.             end;
  752.             aab = aab + 1
  753.             if aab == caa:Peek().Line then
  754.                 _ab = _ab..">> `"..bab:gsub('\t', '    ').."`\n"
  755.                 for i = 1, caa:Peek().Char do
  756.                     local cab = bab:sub(i, i)
  757.                     if cab == '\t' then
  758.                         _ab = _ab..'    '
  759.                     else
  760.                         _ab = _ab..' '
  761.                     end
  762.                 end
  763.                 _ab = _ab.."   ^---"
  764.                 break
  765.             end
  766.         end;
  767.         return _ab
  768.     end;
  769.     local _ba = 0;
  770.     local aba = {}
  771.     local bba = {
  772.         '_',
  773.         'a',
  774.         'b',
  775.         'c',
  776.         'd'
  777.     }
  778.     local function cba(d_b)
  779.         local _ab = {}
  780.         _ab.Parent = d_b
  781.         _ab.LocalList = {}
  782.         _ab.LocalMap = {}
  783.         function _ab:RenameVars()
  784.             for aab, bab in pairs(_ab.LocalList) do
  785.                 local cab;
  786.                 _ba = 0
  787.                 repeat
  788.                     _ba = _ba + 1;
  789.                     local dab = _ba
  790.                     cab = ''
  791.                     while dab > 0 do
  792.                         local _bb = dab % #bba;
  793.                         dab = (dab - _bb) / #bba
  794.                         cab = cab..bba[_bb + 1]
  795.                     end
  796.                 until
  797. not aba[cab] and
  798. not d_b:GetLocal(cab) and not _ab.LocalMap[cab]
  799.                 bab.Name = cab;
  800.                 _ab.LocalMap[cab] = bab
  801.             end
  802.         end
  803.         function _ab:GetLocal(aab)
  804.             local bab = _ab.LocalMap[aab]
  805.             if bab then
  806.                 return bab
  807.             end;
  808.             if _ab.Parent then
  809.                 local cab = _ab.Parent:GetLocal(aab)
  810.                 if cab then
  811.                     return cab
  812.                 end
  813.             end;
  814.             return nil
  815.         end
  816.         function _ab:CreateLocal(aab)
  817.             local bab = {}
  818.             bab.Scope = _ab;
  819.             bab.Name = aab;
  820.             bab.CanRename = true;
  821.             _ab.LocalList[#_ab.LocalList + 1] = bab
  822.             _ab.LocalMap[aab] = bab;
  823.             return bab
  824.         end;
  825.         _ab.Print = function()
  826.             return "<Scope>"
  827.         end;
  828.         return _ab
  829.     end;
  830.     local dba;
  831.     local _ca
  832.     local function aca(d_b)
  833.         local _ab = cba(d_b)
  834.         if not caa:ConsumeSymbol('(') then
  835.             return false, daa("`(` expected.")
  836.         end;
  837.         local aab = {}
  838.         local bab = false
  839.         while not caa:ConsumeSymbol(')') do
  840.             if caa:Is('Ident') then
  841.                 local abb = _ab:CreateLocal(caa:Get().Data)
  842.                 aab[#aab + 1] = abb;
  843.                 if not caa:ConsumeSymbol(',') then
  844.                     if caa:ConsumeSymbol(')') then
  845.                         break
  846.                     else
  847.                         return false, daa("`)` expected.")
  848.                     end
  849.                 end
  850.             elseif caa:ConsumeSymbol('...') then
  851.                 bab = true
  852.                 if not caa:ConsumeSymbol(')') then
  853.                     return false, daa("`...` must be the last argument of a function.")
  854.                 end;
  855.                 break
  856.             else
  857.                 return false, daa("Argument name or `...` expected")
  858.             end
  859.         end;
  860.         local cab, dab = _ca(_ab)
  861.         if not cab then
  862.             return false, dab
  863.         end;
  864.         if not caa:ConsumeKeyword('end') then
  865.             return false, daa("`end` expected after function body")
  866.         end;
  867.         local _bb = {}
  868.         _bb.AstType = 'Function'
  869.         _bb.Scope = _ab;
  870.         _bb.Arguments = aab;
  871.         _bb.Body = dab;
  872.         _bb.VarArg = bab;
  873.         return true, _bb
  874.     end
  875.     local function bca(d_b)
  876.         if caa:ConsumeSymbol('(') then
  877.             local _ab, aab = dba(d_b)
  878.             if not _ab then
  879.                 return false, aab
  880.             end
  881.             if not caa:ConsumeSymbol(')') then
  882.                 return false, daa("`)` Expected.")
  883.             end;
  884.             aab.ParenCount = (aab.ParenCount or 0) + 1;
  885.             return true, aab
  886.         elseif caa:Is('Ident') then
  887.             local _ab = caa:Get()
  888.             local aab = d_b:GetLocal(_ab.Data)
  889.             if not aab then
  890.                 aba[_ab.Data] = true
  891.             end;
  892.             local bab = {}
  893.             bab.AstType = 'VarExpr'
  894.             bab.Name = _ab.Data
  895.             bab.Local = aab;
  896.             return true, bab
  897.         else
  898.             return false, daa("primary expression expected")
  899.         end
  900.     end
  901.     local function cca(d_b, _ab)
  902.         local aab, bab = bca(d_b)
  903.         if not aab then
  904.             return false, bab
  905.         end
  906.         while true do
  907.             if caa:IsSymbol('.') or caa:IsSymbol(':') then
  908.                 local cab = caa:Get().Data;
  909.                 if not caa:Is('Ident') then
  910.                     return false, daa("<Ident> expected.")
  911.                 end;
  912.                 local dab = caa:Get()
  913.                 local _bb = {}
  914.                 _bb.AstType = 'MemberExpr'
  915.                 _bb.Base = bab;
  916.                 _bb.Indexer = cab;
  917.                 _bb.Ident = dab;
  918.                 bab = _bb
  919.             elseif not _ab and caa:ConsumeSymbol('[') then
  920.                 local cab, dab = dba(d_b)
  921.                 if not cab then
  922.                     return false, dab
  923.                 end;
  924.                 if not caa:ConsumeSymbol(']') then
  925.                     return false, daa("`]` expected.")
  926.                 end;
  927.                 local _bb = {}
  928.                 _bb.AstType = 'IndexExpr'
  929.                 _bb.Base = bab;
  930.                 _bb.Index = dab;
  931.                 bab = _bb
  932.             elseif not _ab and caa:ConsumeSymbol('(') then
  933.                 local cab = {}
  934.                 while not caa:ConsumeSymbol(')') do
  935.                     local _bb, abb = dba(d_b)
  936.                     if not _bb then
  937.                         return false, abb
  938.                     end
  939.                     cab[#cab + 1] = abb
  940.                     if not caa:ConsumeSymbol(',') then
  941.                         if caa:ConsumeSymbol(')') then
  942.                             break
  943.                         else
  944.                             return false, daa("`)` Expected.")
  945.                         end
  946.                     end
  947.                 end;
  948.                 local dab = {}
  949.                 dab.AstType = 'CallExpr'
  950.                 dab.Base = bab;
  951.                 dab.Arguments = cab;
  952.                 bab = dab
  953.             elseif not _ab and caa:Is('String') then
  954.                 local cab = {}
  955.                 cab.AstType = 'StringCallExpr'
  956.                 cab.Base = bab
  957.                 cab.Arguments = {
  958.                     caa:Get()
  959.                 }
  960.                 bab = cab
  961.             elseif not _ab and caa:IsSymbol('{') then
  962.                 local cab, dab = dba(d_b)
  963.                 if not cab then
  964.                     return false, dab
  965.                 end;
  966.                 local _bb = {}
  967.                 _bb.AstType = 'TableCallExpr'
  968.                 _bb.Base = bab
  969.                 _bb.Arguments = {
  970.                     dab
  971.                 }
  972.                 bab = _bb
  973.             else
  974.                 break
  975.             end
  976.         end;
  977.         return true, bab
  978.     end
  979.     local function dca(d_b)
  980.         if caa:Is('Number') then
  981.             local _ab = {}
  982.             _ab.AstType = 'NumberExpr'
  983.             _ab.Value = caa:Get()
  984.             return true, _ab
  985.         elseif caa:Is('String') then
  986.             local _ab = {}
  987.             _ab.AstType = 'StringExpr'
  988.             _ab.Value = caa:Get()
  989.             return true, _ab
  990.         elseif caa:ConsumeKeyword('nil') then
  991.             local _ab = {}
  992.             _ab.AstType = 'NilExpr'
  993.             return true, _ab
  994.         elseif caa:IsKeyword('false') or caa:IsKeyword('true') then
  995.             local _ab = {}
  996.             _ab.AstType = 'BooleanExpr'
  997.             _ab.Value = (caa:Get().Data == 'true')
  998.             return true, _ab
  999.         elseif caa:ConsumeSymbol('...') then
  1000.             local _ab = {}
  1001.             _ab.AstType = 'DotsExpr'
  1002.             return true, _ab
  1003.         elseif caa:ConsumeSymbol('{') then
  1004.             local _ab = {}
  1005.             _ab.AstType = 'ConstructorExpr'
  1006.             _ab.EntryList = {}
  1007.             while true do
  1008.                 if caa:IsSymbol('[') then
  1009.                     caa:Get()
  1010.                     local aab, bab = dba(d_b)
  1011.                     if not aab then
  1012.                         return false, daa("Key Expression Expected")
  1013.                     end
  1014.                     if not caa:ConsumeSymbol(']') then
  1015.                         return false, daa("`]` Expected")
  1016.                     end
  1017.                     if not caa:ConsumeSymbol('=') then
  1018.                         return false, daa("`=` Expected")
  1019.                     end;
  1020.                     local cab, dab = dba(d_b)
  1021.                     if not cab then
  1022.                         return false, daa("Value Expression Expected")
  1023.                     end
  1024.                     _ab.EntryList[#_ab.EntryList + 1] = {
  1025.                         Type = 'Key',
  1026.                         Key = bab,
  1027.                         Value = dab
  1028.                     }
  1029.                 elseif caa:Is('Ident') then
  1030.                     local aab = caa:Peek(1)
  1031.                     if aab.Type == 'Symbol' and aab.Data == '=' then
  1032.                         local bab = caa:Get()
  1033.                         if not caa:ConsumeSymbol('=') then
  1034.                             return false, daa("`=` Expected")
  1035.                         end;
  1036.                         local cab, dab = dba(d_b)
  1037.                         if not cab then
  1038.                             return false, daa("Value Expression Expected")
  1039.                         end
  1040.                         _ab.EntryList[#_ab.EntryList + 1] = {
  1041.                             Type = 'KeyString',
  1042.                             Key = bab.Data,
  1043.                             Value = dab
  1044.                         }
  1045.                     else
  1046.                         local bab, cab = dba(d_b)
  1047.                         if not bab then
  1048.                             return false, daa("Value Exected")
  1049.                         end
  1050.                         _ab.EntryList[#_ab.EntryList + 1] = {
  1051.                             Type = 'Value',
  1052.                             Value = cab
  1053.                         }
  1054.                     end
  1055.                 elseif caa:ConsumeSymbol('}') then
  1056.                     break
  1057.                 else
  1058.                     local aab, bab = dba(d_b)
  1059.                     _ab.EntryList[#_ab.EntryList + 1] = {
  1060.                         Type = 'Value',
  1061.                         Value = bab
  1062.                     }
  1063.                     if not aab then
  1064.                         return false, daa("Value Expected")
  1065.                     end
  1066.                 end
  1067.                 if caa:ConsumeSymbol(';') or caa:ConsumeSymbol(',') then
  1068.                 elseif caa:ConsumeSymbol('}') then
  1069.                     break
  1070.                 else
  1071.                     return false, daa("`}` or table entry Expected")
  1072.                 end
  1073.             end;
  1074.             return true, _ab
  1075.         elseif caa:ConsumeKeyword('function') then
  1076.             local _ab, aab = aca(d_b)
  1077.             if not _ab then
  1078.                 return false, aab
  1079.             end;
  1080.             aab.IsLocal = true;
  1081.             return true, aab
  1082.         else
  1083.             return cca(d_b)
  1084.         end
  1085.     end;
  1086.     local _da = lookupify{
  1087.         '-',
  1088.         'not',
  1089.         '#'
  1090.     }
  1091.     local ada = 8
  1092.     local bda = {
  1093.         ['+'] = {
  1094.             6,
  1095.             6
  1096.         },
  1097.         ['-'] = {
  1098.             6,
  1099.             6
  1100.         },
  1101.         ['%'] = {
  1102.             7,
  1103.             7
  1104.         },
  1105.         ['/'] = {
  1106.             7,
  1107.             7
  1108.         },
  1109.         ['*'] = {
  1110.             7,
  1111.             7
  1112.         },
  1113.         ['^'] = {
  1114.             10,
  1115.             9
  1116.         },
  1117.         ['..'] = {
  1118.             5,
  1119.             4
  1120.         },
  1121.         ['=='] = {
  1122.             3,
  1123.             3
  1124.         },
  1125.         ['<'] = {
  1126.             3,
  1127.             3
  1128.         },
  1129.         ['<='] = {
  1130.             3,
  1131.             3
  1132.         },
  1133.         ['~='] = {
  1134.             3,
  1135.             3
  1136.         },
  1137.         ['>'] = {
  1138.             3,
  1139.             3
  1140.         },
  1141.         ['>='] = {
  1142.             3,
  1143.             3
  1144.         },
  1145.         ['and'] = {
  1146.             2,
  1147.             2
  1148.         },
  1149.         ['or'] = {
  1150.             1,
  1151.             1
  1152.         }
  1153.     }
  1154.     local function cda(d_b, _ab)
  1155.         local aab, bab
  1156.         if _da[caa:Peek().Data] then
  1157.             local cab = caa:Get().Data
  1158.             aab, bab = cda(d_b, ada)
  1159.             if not aab then
  1160.                 return false, bab
  1161.             end;
  1162.             local dab = {}
  1163.             dab.AstType = 'UnopExpr'
  1164.             dab.Rhs = bab;
  1165.             dab.Op = cab;
  1166.             bab = dab
  1167.         else
  1168.             aab, bab = dca(d_b)
  1169.             if not aab then
  1170.                 return false, bab
  1171.             end
  1172.         end
  1173.         while true do
  1174.             local cab = bda[caa:Peek().Data]
  1175.             if cab and cab[1] > _ab then
  1176.                 local dab = caa:Get().Data;
  1177.                 local _bb, abb = cda(d_b, cab[2])
  1178.                 if not _bb then
  1179.                     return false, abb
  1180.                 end;
  1181.                 local bbb = {}
  1182.                 bbb.AstType = 'BinopExpr'
  1183.                 bbb.Lhs = bab;
  1184.                 bbb.Op = dab;
  1185.                 bbb.Rhs = abb;
  1186.                 bab = bbb
  1187.             else
  1188.                 break
  1189.             end
  1190.         end;
  1191.         return true, bab
  1192.     end;
  1193.     dba = function(d_b)
  1194.         return cda(d_b, 0)
  1195.     end
  1196.     local function dda(d_b)
  1197.         local _ab = nil
  1198.         if caa:ConsumeKeyword('if') then
  1199.             local aab = {}
  1200.             aab.AstType = 'IfStatement'
  1201.             aab.Clauses = {}
  1202.             repeat
  1203.                 local bab, cab = dba(d_b)
  1204.                 if not bab then
  1205.                     return false, cab
  1206.                 end;
  1207.                 if not caa:ConsumeKeyword('then') then
  1208.                     return false, daa("`then` expected.")
  1209.                 end
  1210.                 local dab, _bb = _ca(d_b)
  1211.                 if not dab then
  1212.                     return false, _bb
  1213.                 end
  1214.                 aab.Clauses[#aab.Clauses + 1] = {
  1215.                     Condition = cab,
  1216.                     Body = _bb
  1217.                 }
  1218.             until not caa:ConsumeKeyword('elseif')
  1219.             if caa:ConsumeKeyword('else') then
  1220.                 local bab, cab = _ca(d_b)
  1221.                 if not bab then
  1222.                     return false, cab
  1223.                 end;
  1224.                 aab.Clauses[#aab.Clauses + 1] = {
  1225.                     Body = cab
  1226.                 }
  1227.             end;
  1228.             if not caa:ConsumeKeyword('end') then
  1229.                 return false, daa("`end` expected.")
  1230.             end;
  1231.             _ab = aab
  1232.         elseif caa:ConsumeKeyword('while') then
  1233.             local aab = {}
  1234.             aab.AstType = 'WhileStatement'
  1235.             local bab, cab = dba(d_b)
  1236.             if not bab then
  1237.                 return false, cab
  1238.             end;
  1239.             if not caa:ConsumeKeyword('do') then
  1240.                 return false, daa("`do` expected.")
  1241.             end;
  1242.             local dab, _bb = _ca(d_b)
  1243.             if not dab then
  1244.                 return false, _bb
  1245.             end;
  1246.             if not caa:ConsumeKeyword('end') then
  1247.                 return false, daa("`end` expected.")
  1248.             end;
  1249.             aab.Condition = cab;
  1250.             aab.Body = _bb;
  1251.             _ab = aab
  1252.         elseif caa:ConsumeKeyword('do') then
  1253.             local aab, bab = _ca(d_b)
  1254.             if not aab then
  1255.                 return false, bab
  1256.             end
  1257.             if not caa:ConsumeKeyword('end') then
  1258.                 return false, daa("`end` expected.")
  1259.             end;
  1260.             local cab = {}
  1261.             cab.AstType = 'DoStatement'
  1262.             cab.Body = bab;
  1263.             _ab = cab
  1264.         elseif caa:ConsumeKeyword('for') then
  1265.             if not caa:Is('Ident') then
  1266.                 return false, daa("<ident> expected.")
  1267.             end;
  1268.             local aab = caa:Get()
  1269.             if caa:ConsumeSymbol('=') then
  1270.                 local bab = cba(d_b)
  1271.                 local cab = bab:CreateLocal(aab.Data)
  1272.                 local dab, _bb = dba(d_b)
  1273.                 if not dab then
  1274.                     return false, _bb
  1275.                 end
  1276.                 if not caa:ConsumeSymbol(',') then
  1277.                     return false, daa("`,` Expected")
  1278.                 end;
  1279.                 local abb, bbb = dba(d_b)
  1280.                 if not abb then
  1281.                     return false, bbb
  1282.                 end;
  1283.                 local cbb, dbb
  1284.                 if caa:ConsumeSymbol(',') then
  1285.                     cbb, dbb = dba(d_b)
  1286.                     if not cbb then
  1287.                         return false, dbb
  1288.                     end
  1289.                 end;
  1290.                 if not caa:ConsumeKeyword('do') then
  1291.                     return false, daa("`do` expected")
  1292.                 end;
  1293.                 local _cb, acb = _ca(bab)
  1294.                 if not _cb then
  1295.                     return false, acb
  1296.                 end;
  1297.                 if not caa:ConsumeKeyword('end') then
  1298.                     return false, daa("`end` expected")
  1299.                 end;
  1300.                 local bcb = {}
  1301.                 bcb.AstType = 'NumericForStatement'
  1302.                 bcb.Scope = bab;
  1303.                 bcb.Variable = cab;
  1304.                 bcb.Start = _bb;
  1305.                 bcb.End = bbb;
  1306.                 bcb.Step = dbb
  1307.                 bcb.Body = acb;
  1308.                 _ab = bcb
  1309.             else
  1310.                 local bab = cba(d_b)
  1311.                 local cab = {
  1312.                     bab:CreateLocal(aab.Data)
  1313.                 }
  1314.                 while caa:ConsumeSymbol(',') do
  1315.                     if not caa:Is('Ident') then
  1316.                         return false, daa("for variable expected.")
  1317.                     end
  1318.                     cab[#cab + 1] = bab:CreateLocal(caa:Get().Data)
  1319.                 end;
  1320.                 if not caa:ConsumeKeyword('in') then
  1321.                     return false, daa("`in` expected.")
  1322.                 end;
  1323.                 local dab = {}
  1324.                 local _bb, abb = dba(d_b)
  1325.                 if not _bb then
  1326.                     return false, abb
  1327.                 end;
  1328.                 dab[#dab + 1] = abb
  1329.                 while caa:ConsumeSymbol(',') do
  1330.                     local _cb, acb = dba(d_b)
  1331.                     if not _cb then
  1332.                         return false, acb
  1333.                     end;
  1334.                     dab[#dab + 1] = acb
  1335.                 end;
  1336.                 if not caa:ConsumeKeyword('do') then
  1337.                     return false, daa("`do` expected.")
  1338.                 end;
  1339.                 local bbb, cbb = _ca(bab)
  1340.                 if not bbb then
  1341.                     return false, cbb
  1342.                 end;
  1343.                 if not caa:ConsumeKeyword('end') then
  1344.                     return false, daa("`end` expected.")
  1345.                 end;
  1346.                 local dbb = {}
  1347.                 dbb.AstType = 'GenericForStatement'
  1348.                 dbb.Scope = bab;
  1349.                 dbb.VariableList = cab;
  1350.                 dbb.Generators = dab;
  1351.                 dbb.Body = cbb;
  1352.                 _ab = dbb
  1353.             end
  1354.         elseif caa:ConsumeKeyword('repeat') then
  1355.             local aab, bab = _ca(d_b)
  1356.             if not aab then
  1357.                 return false, bab
  1358.             end;
  1359.             if not caa:ConsumeKeyword('until') then
  1360.                 return false, daa("`until` expected.")
  1361.             end;
  1362.             local cab, dab = dba(d_b)
  1363.             if not cab then
  1364.                 return false, dab
  1365.             end;
  1366.             local _bb = {}
  1367.             _bb.AstType = 'RepeatStatement'
  1368.             _bb.Condition = dab;
  1369.             _bb.Body = bab;
  1370.             _ab = _bb
  1371.         elseif caa:ConsumeKeyword('function') then
  1372.             if not caa:Is('Ident') then
  1373.                 return false, daa("Function name expected")
  1374.             end;
  1375.             local aab, bab = cca(d_b, true)
  1376.             if not aab then
  1377.                 return false, bab
  1378.             end;
  1379.             local cab, dab = aca(d_b)
  1380.             if not cab then
  1381.                 return false, dab
  1382.             end
  1383.             dab.IsLocal = false;
  1384.             dab.Name = bab;
  1385.             _ab = dab
  1386.         elseif caa:ConsumeKeyword('local') then
  1387.             if caa:Is('Ident') then
  1388.                 local aab = {
  1389.                     caa:Get().Data
  1390.                 }
  1391.                 while caa:ConsumeSymbol(',') do
  1392.                     if not caa:Is('Ident') then
  1393.                         return false, daa("local var name expected")
  1394.                     end
  1395.                     aab[#aab + 1] = caa:Get().Data
  1396.                 end;
  1397.                 local bab = {}
  1398.                 if caa:ConsumeSymbol('=') then
  1399.                     repeat
  1400.                         local dab, _bb = dba(d_b)
  1401.                         if not dab then
  1402.                             return false, _bb
  1403.                         end
  1404.                         bab[#bab + 1] = _bb
  1405.                     until not caa:ConsumeSymbol(',')
  1406.                 end;
  1407.                 for dab, _bb in pairs(aab) do
  1408.                     aab[dab] = d_b:CreateLocal(_bb)
  1409.                 end
  1410.                 local cab = {}
  1411.                 cab.AstType = 'LocalStatement'
  1412.                 cab.LocalList = aab;
  1413.                 cab.InitList = bab;
  1414.                 _ab = cab
  1415.             elseif caa:ConsumeKeyword('function') then
  1416.                 if not caa:Is('Ident') then
  1417.                     return false, daa("Function name expected")
  1418.                 end;
  1419.                 local aab = caa:Get().Data
  1420.                 local bab = d_b:CreateLocal(aab)
  1421.                 local cab, dab = aca(d_b)
  1422.                 if not cab then
  1423.                     return false, dab
  1424.                 end;
  1425.                 dab.Name = bab
  1426.                 dab.IsLocal = true;
  1427.                 _ab = dab
  1428.             else
  1429.                 return false, daa("local var or function def expected")
  1430.             end
  1431.         elseif caa:ConsumeSymbol('::') then
  1432.             if not caa:Is('Ident') then
  1433.                 return false, daa('Label name expected')
  1434.             end
  1435.             local aab = caa:Get().Data
  1436.             if not caa:ConsumeSymbol('::') then
  1437.                 return false, daa("`::` expected")
  1438.             end;
  1439.             local bab = {}
  1440.             bab.AstType = 'LabelStatement'
  1441.             bab.Label = aab;
  1442.             _ab = bab
  1443.         elseif caa:ConsumeKeyword('return') then
  1444.             local aab = {}
  1445.             if not caa:IsKeyword('end') then
  1446.                 local cab, dab = dba(d_b)
  1447.                 if cab then
  1448.                     aab[1] = dab;
  1449.                     while caa:ConsumeSymbol(',') do
  1450.                         local _bb, abb = dba(d_b)
  1451.                         if not _bb then
  1452.                             return false, abb
  1453.                         end
  1454.                         aab[#aab + 1] = abb
  1455.                     end
  1456.                 end
  1457.             end;
  1458.             local bab = {}
  1459.             bab.AstType = 'ReturnStatement'
  1460.             bab.Arguments = aab;
  1461.             _ab = bab
  1462.         elseif caa:ConsumeKeyword('break') then
  1463.             local aab = {}
  1464.             aab.AstType = 'BreakStatement'
  1465.             _ab = aab
  1466.         elseif caa:IsKeyword('goto') then
  1467.             if not caa:Is('Ident') then
  1468.                 return false, daa("Label expected")
  1469.             end;
  1470.             local aab = caa:Get().Data;
  1471.             local bab = {}
  1472.             bab.AstType = 'GotoStatement'
  1473.             bab.Label = aab;
  1474.             _ab = bab
  1475.         else
  1476.             local aab, bab = cca(d_b)
  1477.             if not aab then
  1478.                 return false, bab
  1479.             end
  1480.             if caa:IsSymbol(',') or caa:IsSymbol('=') then
  1481.                 if (bab.ParenCount or 0) > 0 then
  1482.                     return false, daa("Can not assign to parenthesized expression, is not an lvalue")
  1483.                 end;
  1484.                 local cab = {
  1485.                     bab
  1486.                 }
  1487.                 while caa:ConsumeSymbol(',') do
  1488.                     local cbb, dbb = cca(d_b)
  1489.                     if not cbb then
  1490.                         return false, dbb
  1491.                     end;
  1492.                     cab[#cab + 1] = dbb
  1493.                 end
  1494.                 if not caa:ConsumeSymbol('=') then
  1495.                     return false, daa("`=` Expected.")
  1496.                 end;
  1497.                 local dab = {}
  1498.                 local _bb, abb = dba(d_b)
  1499.                 if not _bb then
  1500.                     return false, abb
  1501.                 end;
  1502.                 dab[1] = abb;
  1503.                 while caa:ConsumeSymbol(',') do
  1504.                     local cbb, dbb = dba(d_b)
  1505.                     if not cbb then
  1506.                         return false, dbb
  1507.                     end
  1508.                     dab[#dab + 1] = dbb
  1509.                 end;
  1510.                 local bbb = {}
  1511.                 bbb.AstType = 'AssignmentStatement'
  1512.                 bbb.Lhs = cab;
  1513.                 bbb.Rhs = dab;
  1514.                 _ab = bbb
  1515.             elseif bab.AstType == 'CallExpr' or bab.AstType == 'TableCallExpr' or bab.AstType == 'StringCallExpr' then
  1516.                 local cab = {}
  1517.                 cab.AstType = 'CallStatement'
  1518.                 cab.Expression = bab;
  1519.                 _ab = cab
  1520.             else
  1521.                 return false, daa("Assignment Statement Expected")
  1522.             end
  1523.         end;
  1524.         _ab.HasSemicolon = caa:ConsumeSymbol(';')
  1525.         return true, _ab
  1526.     end
  1527.     local __b = lookupify{
  1528.         'end',
  1529.         'else',
  1530.         'elseif',
  1531.         'until'
  1532.     }
  1533.     _ca = function(d_b)
  1534.         local _ab = {}
  1535.         _ab.Scope = cba(d_b)
  1536.         _ab.AstType = 'Statlist'
  1537.         local aab = {}
  1538.         while not __b[caa:Peek().Data] and not caa:IsEof() do
  1539.             local bab, cab = dda(_ab.Scope)
  1540.             if not bab then
  1541.                 return false, cab
  1542.             end;
  1543.             aab[#aab + 1] = cab
  1544.         end;
  1545.         _ab.Body = aab;
  1546.         return true, _ab
  1547.     end;
  1548.     local function a_b()
  1549.         local d_b = cba()
  1550.         return _ca(d_b)
  1551.     end;
  1552.     local b_b, c_b = a_b()
  1553.     return b_b, c_b
  1554. end
  1555. local c_a = lookupify{
  1556.     'a',
  1557.     'b',
  1558.     'c',
  1559.     'd',
  1560.     'e',
  1561.     'f',
  1562.     'g',
  1563.     'h',
  1564.     'i',
  1565.     'j',
  1566.     'k',
  1567.     'l',
  1568.     'm',
  1569.     'n',
  1570.     'o',
  1571.     'p',
  1572.     'q',
  1573.     'r',
  1574.     's',
  1575.     't',
  1576.     'u',
  1577.     'v',
  1578.     'w',
  1579.     'x',
  1580.     'y',
  1581.     'z'
  1582. }
  1583. local d_a = lookupify{
  1584.     'A',
  1585.     'B',
  1586.     'C',
  1587.     'D',
  1588.     'E',
  1589.     'F',
  1590.     'G',
  1591.     'H',
  1592.     'I',
  1593.     'J',
  1594.     'K',
  1595.     'L',
  1596.     'M',
  1597.     'N',
  1598.     'O',
  1599.     'P',
  1600.     'Q',
  1601.     'R',
  1602.     'S',
  1603.     'T',
  1604.     'U',
  1605.     'V',
  1606.     'W',
  1607.     'X',
  1608.     'Y',
  1609.     'Z'
  1610. }
  1611. local _aa = lookupify{
  1612.     '0',
  1613.     '1',
  1614.     '2',
  1615.     '3',
  1616.     '4',
  1617.     '5',
  1618.     '6',
  1619.     '7',
  1620.     '8',
  1621.     '9'
  1622. }
  1623. function Format_Mini(aaa)
  1624.     local baa, caa;
  1625.     local daa = 0
  1626.     local function _ba(bba, cba, dba)
  1627.         if daa > 150 then
  1628.             daa = 0;
  1629.             return bba.."\n"..cba
  1630.         end;
  1631.         dba = dba or ' '
  1632.         local _ca, aca = bba:sub(-1, -1), cba:sub(1, 1)
  1633.         if d_a[_ca] or c_a[_ca] or _ca == '_' then
  1634.             if not(d_a[aca] or c_a[aca] or aca == '_' or _aa[aca]) then
  1635.                 return bba..cba
  1636.             elseif aca == '(' then
  1637.                 print("==============>>>", _ca, aca)
  1638.                 return bba..dba..cba
  1639.             else
  1640.                 return bba..dba..cba
  1641.             end
  1642.         elseif _aa[_ca] then
  1643.             if aca == '(' then
  1644.                 return bba..cba
  1645.             else
  1646.                 return bba..dba..cba
  1647.             end
  1648.         elseif _ca == '' then
  1649.             return bba..cba
  1650.         else
  1651.             if aca == '(' then
  1652.                 return bba..dba..cba
  1653.             else
  1654.                 return bba..cba
  1655.             end
  1656.         end
  1657.     end
  1658.     caa = function(bba)
  1659.         local cba = string.rep('(', bba.ParenCount or 0)
  1660.         if bba.AstType == 'VarExpr' then
  1661.             if bba.Local then
  1662.                 cba = cba..bba.Local.Name
  1663.             else
  1664.                 cba = cba..bba.Name
  1665.             end
  1666.         elseif bba.AstType == 'NumberExpr' then
  1667.             cba = cba..bba.Value.Data
  1668.         elseif bba.AstType == 'StringExpr' then
  1669.             cba = cba..bba.Value.Data
  1670.         elseif bba.AstType == 'BooleanExpr' then
  1671.             cba = cba..tostring(bba.Value)
  1672.         elseif bba.AstType == 'NilExpr' then
  1673.             cba = _ba(cba, "nil")
  1674.         elseif bba.AstType == 'BinopExpr' then
  1675.             cba = _ba(cba, caa(bba.Lhs))
  1676.             cba = _ba(cba, bba.Op)
  1677.             cba = _ba(cba, caa(bba.Rhs))
  1678.         elseif bba.AstType == 'UnopExpr' then
  1679.             cba = _ba(cba, bba.Op)
  1680.             cba = _ba(cba, caa(bba.Rhs))
  1681.         elseif bba.AstType == 'DotsExpr' then
  1682.             cba = cba.."..."
  1683.         elseif bba.AstType == 'CallExpr' then
  1684.             cba = cba..caa(bba.Base)
  1685.             cba = cba.."("
  1686.             for i = 1, #bba.Arguments do
  1687.                 cba = cba..caa(bba.Arguments[i])
  1688.                 if i ~= #bba.Arguments then
  1689.                     cba = cba..","
  1690.                 end
  1691.             end;
  1692.             cba = cba..")"
  1693.         elseif bba.AstType == 'TableCallExpr' then
  1694.             cba = cba..caa(bba.Base)
  1695.             cba = cba..caa(bba.Arguments[1])
  1696.         elseif bba.AstType == 'StringCallExpr' then
  1697.             cba = cba..caa(bba.Base)
  1698.             cba = cba..bba.Arguments[1].Data
  1699.         elseif bba.AstType == 'IndexExpr' then
  1700.             cba = cba..caa(bba.Base).."["..caa(bba.Index).."]"
  1701.         elseif bba.AstType == 'MemberExpr' then
  1702.             cba = cba..caa(bba.Base)..bba.Indexer..bba.Ident.Data
  1703.         elseif bba.AstType == 'Function' then
  1704.             bba.Scope:RenameVars()
  1705.             cba = cba.."function("
  1706.             if #bba.Arguments > 0 then
  1707.                 for i = 1, #bba.Arguments do
  1708.                     cba = cba..bba.Arguments[i].Name
  1709.                     if i ~= #bba.Arguments then
  1710.                         cba = cba..","
  1711.                     elseif bba.VarArg then
  1712.                         cba = cba..",..."
  1713.                     end
  1714.                 end
  1715.             elseif bba.VarArg then
  1716.                 cba = cba.."..."
  1717.             end;
  1718.             cba = cba..")"
  1719.             cba = _ba(cba, baa(bba.Body))
  1720.             cba = _ba(cba, "end")
  1721.         elseif bba.AstType == 'ConstructorExpr' then
  1722.             cba = cba.."{"
  1723.             for i = 1, #bba.EntryList do
  1724.                 local dba = bba.EntryList[i]
  1725.                 if dba.Type == 'Key' then
  1726.                     cba = cba.."["..caa(dba.Key).."]="..caa(dba.Value)
  1727.                 elseif dba.Type == 'Value' then
  1728.                     cba = cba..caa(dba.Value)
  1729.                 elseif dba.Type == 'KeyString' then
  1730.                     cba = cba..dba.Key.."="..caa(dba.Value)
  1731.                 end;
  1732.                 if i ~= #bba.EntryList then
  1733.                     cba = cba..","
  1734.                 end
  1735.             end;
  1736.             cba = cba.."}"
  1737.         end
  1738.         cba = cba..string.rep(')', bba.ParenCount or 0)
  1739.         daa = daa + #cba;
  1740.         return cba
  1741.     end
  1742.     local aba = function(bba)
  1743.         local cba = ''
  1744.         if bba.AstType == 'AssignmentStatement' then
  1745.             for i = 1, #bba.Lhs do
  1746.                 cba = cba..caa(bba.Lhs[i])
  1747.                 if i ~= #bba.Lhs then
  1748.                     cba = cba..","
  1749.                 end
  1750.             end;
  1751.             if #bba.Rhs > 0 then
  1752.                 cba = cba.."="
  1753.                 for i = 1, #bba.Rhs do
  1754.                     cba = cba..caa(bba.Rhs[i])
  1755.                     if i ~= #bba.Rhs then
  1756.                         cba = cba..","
  1757.                     end
  1758.                 end
  1759.             end
  1760.         elseif bba.AstType == 'CallStatement' then
  1761.             cba = caa(bba.Expression)
  1762.         elseif bba.AstType == 'LocalStatement' then
  1763.             cba = cba.."local "
  1764.             for i = 1, #bba.LocalList do
  1765.                 cba = cba..bba.LocalList[i].Name;
  1766.                 if i ~= #bba.LocalList then
  1767.                     cba = cba..","
  1768.                 end
  1769.             end
  1770.             if #bba.InitList > 0 then
  1771.                 cba = cba.."="
  1772.                 for i = 1, #bba.InitList do
  1773.                     cba = cba..caa(bba.InitList[i])
  1774.                     if i ~= #bba.InitList then
  1775.                         cba = cba..","
  1776.                     end
  1777.                 end
  1778.             end
  1779.         elseif bba.AstType == 'IfStatement' then
  1780.             cba = _ba("if", caa(bba.Clauses[1].Condition))
  1781.             cba = _ba(cba, "then")
  1782.             cba = _ba(cba, baa(bba.Clauses[1].Body))
  1783.             for i = 2, #bba.Clauses do
  1784.                 local dba = bba.Clauses[i]
  1785.                 if dba.Condition then
  1786.                     cba = _ba(cba, "elseif")
  1787.                     cba = _ba(cba, caa(dba.Condition))
  1788.                     cba = _ba(cba, "then")
  1789.                 else
  1790.                     cba = _ba(cba, "else")
  1791.                 end;
  1792.                 cba = _ba(cba, baa(dba.Body))
  1793.             end;
  1794.             cba = _ba(cba, "end")
  1795.         elseif bba.AstType == 'WhileStatement' then
  1796.             cba = _ba("while", caa(bba.Condition))
  1797.             cba = _ba(cba, "do")
  1798.             cba = _ba(cba, baa(bba.Body))
  1799.             cba = _ba(cba, "end")
  1800.         elseif bba.AstType == 'DoStatement' then
  1801.             cba = _ba(cba, "do")
  1802.             cba = _ba(cba, baa(bba.Body))
  1803.             cba = _ba(cba, "end")
  1804.         elseif bba.AstType == 'ReturnStatement' then
  1805.             cba = "return"
  1806.             for i = 1, #bba.Arguments do
  1807.                 cba = _ba(cba, caa(bba.Arguments[i]))
  1808.                 if i ~= #bba.Arguments then
  1809.                     cba = cba..","
  1810.                 end
  1811.             end
  1812.         elseif bba.AstType == 'BreakStatement' then
  1813.             cba = "break"
  1814.         elseif bba.AstType == 'RepeatStatement' then
  1815.             cba = "repeat"
  1816.             cba = _ba(cba, baa(bba.Body))
  1817.             cba = _ba(cba, "until")
  1818.             cba = _ba(cba, caa(bba.Condition))
  1819.         elseif bba.AstType == 'Function' then
  1820.             bba.Scope:RenameVars()
  1821.             if bba.IsLocal then
  1822.                 cba = "local"
  1823.             end;
  1824.             cba = _ba(cba, "function ")
  1825.             if bba.IsLocal then
  1826.                 cba = cba..bba.Name.Name
  1827.             else
  1828.                 cba = cba..caa(bba.Name)
  1829.             end;
  1830.             cba = cba.."("
  1831.             if #bba.Arguments > 0 then
  1832.                 for i = 1, #bba.Arguments do
  1833.                     cba = cba..bba.Arguments[i].Name;
  1834.                     if i ~= #bba.Arguments then
  1835.                         cba = cba..","
  1836.                     elseif bba.VarArg then
  1837.                         print("Apply vararg")
  1838.                         cba = cba..",..."
  1839.                     end
  1840.                 end
  1841.             elseif bba.VarArg then
  1842.                 cba = cba.."..."
  1843.             end;
  1844.             cba = cba..")"
  1845.             cba = _ba(cba, baa(bba.Body))
  1846.             cba = _ba(cba, "end")
  1847.         elseif bba.AstType == 'GenericForStatement' then
  1848.             bba.Scope:RenameVars()
  1849.             cba = "for "
  1850.             for i = 1, #bba.VariableList do
  1851.                 cba = cba..bba.VariableList[i].Name;
  1852.                 if i ~= #bba.VariableList then
  1853.                     cba = cba..","
  1854.                 end
  1855.             end;
  1856.             cba = cba.." in"
  1857.             for i = 1, #bba.Generators do
  1858.                 cba = _ba(cba, caa(bba.Generators[i]))
  1859.                 if i ~= #bba.Generators then
  1860.                     cba = _ba(cba, ',')
  1861.                 end
  1862.             end;
  1863.             cba = _ba(cba, "do")
  1864.             cba = _ba(cba, baa(bba.Body))
  1865.             cba = _ba(cba, "end")
  1866.         elseif bba.AstType == 'NumericForStatement' then
  1867.             cba = "for "
  1868.             cba = cba..bba.Variable.Name.."="
  1869.             cba = cba..caa(bba.Start)..","..caa(bba.End)
  1870.             if bba.Step then
  1871.                 cba = cba..","..caa(bba.Step)
  1872.             end;
  1873.             cba = _ba(cba, "do")
  1874.             cba = _ba(cba, baa(bba.Body))
  1875.             cba = _ba(cba, "end")
  1876.         end;
  1877.         daa = daa + #cba;
  1878.         return cba
  1879.     end
  1880.     baa = function(bba)
  1881.         local cba = ''
  1882.         bba.Scope:RenameVars()
  1883.         for dba, _ca in pairs(bba.Body) do
  1884.             cba = _ba(cba, aba(_ca), ';')
  1885.         end;
  1886.         return cba
  1887.     end;
  1888.     aaa.Scope:RenameVars()
  1889.     return baa(aaa)
  1890. end
  1891. _G.Minify = function(aaa)
  1892.     local baa, caa = ParseLua(aaa)
  1893.     if not baa then
  1894.         return false, caa
  1895.     end;
  1896.     return true, Format_Mini(caa)
  1897. end
Add Comment
Please, Sign In to add comment