FeynmanTech

CL

Mar 17th, 2015
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.30 KB | None | 0 0
  1. function trim(s)
  2. return (tostring(s):gsub("^%s*(.-)%s*$", "%1"))
  3. end
  4.  
  5. local key, proc, rank = {}, {}, {}
  6.  
  7. local vars = {}
  8.  
  9. -- for $varname : start, end, step { statement; };
  10. key["for"] = "for%s-%$(%S+)%s-:%s-([^,]-),%s-([^,{]-),%s-([^{]-)%s-(%b{});"
  11. proc["for"] = function(lvars, var, start, stop, step, src)
  12. lvars[var] = start
  13. while tonumber(lvars[var]) <= tonumber(stop) do
  14. parse(src:sub(2, -2), lvars)
  15. lvars[var] = lvars[var] + eval(step, lvars)
  16. end
  17. end
  18. rank["for"] = 0
  19. -- while conditions { statement; };
  20. key["while"] = "while%s-([^{]-)%s-(%b{});"
  21. proc["while"] = function(lvars, conditions, src)
  22. --lvars[var] = start
  23. while isTrue(conditions, lvars) do
  24. parse(src:sub(2, -2), lvars)
  25. end
  26. end
  27. rank["while"] = 0
  28.  
  29. -- if conditions { statement; };
  30. key["if"] = "if%s-([^{]-)%s-(%b{});"
  31. proc["if"] = function(lvars, conditions, src)
  32. --lvars[var] = start
  33. if isTrue(conditions, lvars) then
  34. parse(src:sub(2, -2), lvars)
  35. end
  36. end
  37. rank["if"] = 0
  38.  
  39. key["if.-{.-}%s-else%s-%b{}"] = "if%s-([^{]-)%s-(%b{})%s-else%s-(%b{});"
  40. proc["if.-{.-}%s-else%s-%b{}"] = function(lvars, conditions, src, src2)
  41. --lvars[var] = start
  42. if isTrue(conditions, lvars) then
  43. parse(src:sub(2, -2), lvars)
  44. else
  45. parse(src2:sub(2, -2), lvars)
  46. end
  47. end
  48. rank["if.-{.-}%s-else%s-%b{}"] = 1
  49.  
  50. key["if.-{.-}%s-elseif"] = "if%s-([^{]-)%s-(%b{})%s-(elseif%s-[^}]+%s-%b{}.-;~)"
  51. proc["if.-{.-}%s-elseif"] = function(lvars, conditions, src, chunk2)
  52. --lvars[var] = start
  53. if isTrue(conditions, lvars) then
  54. parse(src:sub(2, -2), lvars)
  55. else
  56. parse(chunk2:sub(5, -1), lvars)
  57. end
  58. end
  59. rank["if.-{.-}%s-elseif"] = 2
  60.  
  61. key["return"] = "return(.-);"
  62. proc["return"] = function(lvars, args)
  63. --print("Returning...")
  64. args = trim(args)
  65. --[[
  66. _RETURN = ""
  67. for arg in args:gmatch("([^,]-),") do
  68. _RETURN = eval(arg, lvars)
  69. end
  70. --]]
  71. _RETURN = eval(args, lvars)
  72. --print(_RETURN)
  73. end
  74. rank["return"] = 0
  75.  
  76. key["print"] = "print%s+(.-);"
  77. proc["print"] = function(lvars, stuff)
  78. stuff = "," .. stuff .. ","
  79. for v in stuff:gmatch(",%s-(.-),") do
  80. print(eval(v, lvars))
  81. end
  82. end
  83. rank["if.-{.-}%s-elseif"] = 2
  84.  
  85. local ops, opProc = {}, {}
  86.  
  87. ops["="] = "$([%w_]+)%s-=%s-([^;]+);"
  88. opProc["="] = function(lvars, var, val)
  89. vars[var] = eval(val, lvars)
  90. end
  91.  
  92. ops["+="] = "$([%w_]+)%s-%+%s-=%s-([^;]+);"
  93. opProc["+="] = function(lvars, var, val)
  94. if not vars[var] then
  95. clError("$"..var.."+="..val, "Operation on undefined variable "..var)
  96. return
  97. end
  98. local res = eval(val, lvars)
  99. if not(tonumber(res)) then
  100. clError("$"..var.."+="..val, "Operation on numeric $" .. var .. " using non-numeric value")
  101. return
  102. end
  103. vars[var] = vars[var] + eval(val, lvars)
  104. end
  105.  
  106. ops["++"] = "$([%w_]+)%s-%+%s-%+%s-;"
  107. opProc["++"] = function(lvars, var, val)
  108. if not vars[var] then
  109. clError("$"..var.."++", "Operation on undefined variable "..var)
  110. return
  111. elseif not tonumber(vars[var]) then
  112. clError("$"..var.."++", "Numeric operation on variable "..var .. " of non-numeric type " .. type(vars[var]))
  113. return
  114. end
  115. vars[var] = vars[var] + 1
  116. end
  117.  
  118. ops["-="] = "$([%w_]+)%s-%-%s-=%s-([^;]+);"
  119. opProc["-="] = function(lvars, var, val)
  120. if not vars[var] then
  121. clError("$"..var.."-="..val, "Operation on undefined variable "..var)
  122. return
  123. elseif not tonumber(vars[var]) then
  124. clError("$"..var.."+="..val, "Numeric operation on variable "..var .. " of non-numeric type " .. type(vars[var]))
  125. return
  126. end
  127. local res = eval(val, lvars)
  128. if not(tonumber(res)) then
  129. clError("$"..var.."-="..val, "Operation on numeric $" .. var .. " using non-numeric value")
  130. return
  131. end
  132. vars[var] = vars[var] + eval(val, lvars)
  133. end
  134.  
  135. ops["--"] = "$([%w_]+)%s-%-%s-%-%s-;"
  136. opProc["--"] = function(lvars, var, val)
  137. if not vars[var] then
  138. clError("$"..var.."--", "Operation on undefined variable "..var)
  139. return
  140. elseif not tonumber(vars[var]) then
  141. clError("$"..var.."++", "Numeric operation on variable "..var .. " of non-numeric type " .. type(vars[var]))
  142. return
  143. end
  144. vars[var] = vars[var] - 1
  145. end
  146.  
  147. ops[".="] = "$([%w_]+)%s-%.%s-=%s-([^;]+);"
  148. opProc[".="] = function(lvars, var, val)
  149. if not vars[var] then
  150. clError("$"..var..".="..val, "Operation on undefined variable "..var)
  151. return
  152. end
  153. vars[var] = tostring(vars[var]) .. tostring(eval(val, lvars))
  154. end
  155.  
  156. local preProc, preFunc = {}, {}
  157. preProc.def = "def%s-(%S+)%s+([^\n]+)"
  158. preFunc.def = function(src, n, v)
  159. return src:gsub("@" .. n, v)
  160. end
  161.  
  162. local func = {}
  163. _RETURNSTACK ={}
  164.  
  165. key["function"] = "function%s-(%w-)%s-:%s-(.-)(%b{});"
  166. proc["function"] = function(lvars, name, args, src)
  167. local s = "return function("
  168. args = trim(args:gsub("%s", "") .. ",")
  169. local a = {}
  170. for arg in args:gmatch("([^,]-),") do
  171. --s = s .. arg .. ","
  172. table.insert(a, arg)
  173. end
  174. s = s .. table.concat(a, ",") .. ")\nlocal lvars = {}\n"
  175. for i, v in ipairs(a) do
  176. s = s .. "lvars['" .. v .. "']=" .. v .. "\n"
  177. end
  178. s = s .. "parse([[" .. src:sub(2, -2) .. "]], lvars)\n return _RETURN end"
  179. --print(s)
  180. local f, err = loadstring(s)
  181. if f then
  182. func[name] = f()
  183. else
  184. print(err)
  185. end
  186. end
  187.  
  188. func.print = function(lvars, ...)
  189. local t = {}
  190. for i, v in ipairs{...} do
  191. table.insert(t, eval(v, lvars))
  192. end
  193. print(unpack(t))
  194. end
  195.  
  196. func.set = function(lvars, name, val)
  197. vars[name] = val
  198. end
  199.  
  200. func.lua = function(lvars, s) return loadstring(s:gsub("vars", "({...})[1]"))(vars) end
  201.  
  202. getFunc = function(n) return func[n] end
  203.  
  204. CL_LOC = ""
  205.  
  206. function clError(loc, msg)
  207. print('Error: ' .. loc .. '\n' .. msg)
  208. end
  209.  
  210. function eval(statement, lvars)
  211. statement = tostring(statement)
  212. lvars = lvars or {}
  213. local value
  214. for i, v in pairs(lvars) do
  215. statement = statement:gsub("%$" .. tostring(i), trim(v))
  216. end
  217. for i, v in pairs(vars) do
  218. statement = statement:gsub("%$" .. tostring(i), trim(v))
  219. end
  220. --[[
  221. string.gsub(statement, "([%w_]+)%s-(%b%(%))", function(active, argStr)
  222. local args = {}
  223. for arg in argStr:gmatch("([^,]-),") do
  224. arg = trim(arg)
  225. arg = eval(arg, lvars) or arg
  226. table.insert(args, arg)
  227. end
  228. if func[active] then
  229. local r = func[active](unpack(args))
  230. return r or ""
  231. end
  232. end)
  233. --]]
  234. statement = string.gsub(statement, "([%w_]+)%s-(%b())", "(getFunc('%1'))%2")
  235. local f, err = loadstring("return " .. statement)
  236. local s, val = pcall(f)
  237. if not err then value = val or statement else value = statement end
  238. return value
  239. end
  240.  
  241. function isTrue(statement, lvars)
  242. statement = tostring(statement)
  243. lvars = lvars or {}
  244. local value
  245. for i, v in pairs(lvars) do
  246. statement = statement:gsub("%$" .. tostring(i), trim(v))
  247. end
  248. for i, v in pairs(vars) do
  249. statement = statement:gsub("%$" .. tostring(i), trim(v))
  250. end
  251. statement = statement:gsub("([%w_]-)%s-(%b%(%))", function(active, argStr)
  252. local args = {}
  253. for arg in argStr:gmatch("([^,]-),") do
  254. arg = trim(arg)
  255. arg = eval(arg, lvars) or arg
  256. table.insert(args, arg)
  257. end
  258. local r = func[active](unpack(args))
  259. return r or ""
  260. end)
  261. local f, err = loadstring("return " .. statement)
  262. if not err then value = f() else value = statement end
  263. return value, err
  264. end
  265.  
  266. function parse(str, lvars)
  267. for i, v in pairs(preProc) do
  268. --print(preFunc[i])
  269. str = str:gsub(v, preFunc[i])
  270. end
  271. lvars = lvars or {}
  272. while str:match(" ") do
  273. str = str:gsub(" ", " ")
  274. end
  275. str = str:gsub("%[#.-#%]", "")
  276. str = str:gsub("##.-\n", "")
  277. local pos = 0
  278. local p = true
  279. while (pos < #str) and p do
  280. local active = str:sub(pos, str:find("[^%w_]", pos) -1)
  281. if str:sub(pos, pos+1):find("%s") then
  282. pos = pos + 1
  283. elseif str:sub(pos, pos) == "$" then
  284. for i, v in pairs(ops) do
  285. if str:find(v, pos) == pos then
  286. local opStr = trim(str:sub(pos, str:find(";", pos + 1)))
  287. opProc[i](lvars, opStr:gmatch(ops[i])())
  288. pos = str:find(";", pos + 1)
  289. end
  290. end
  291. elseif key[active] and str:find(key[active], pos-1) == pos then
  292. local b, e = str:find(key[active], pos-1)
  293. proc[active](lvars or {}, str:gmatch(key[active], pos-1)())
  294. pos = pos + e - b
  295. elseif func[active] then
  296. local argStr = (str:match("%b()", pos):sub(2, -2) .. ","):gsub(",%s+", ",")
  297. local args = {}
  298. local aPos, aCount, aCurrent, aLevel, aLChar = 1, 1, "", 0, ""
  299. local aChars = {["("] = ")", ["{"] = "}"}
  300. --[[
  301. for arg in argStr:gmatch("([^,]-),") do
  302. arg = trim(arg)
  303. arg = eval(arg, lvars) or arg
  304. table.insert(args, arg)
  305. end
  306. --[=[
  307. --]]
  308. local aStr = ""
  309. --print(argStr)
  310. while aPos <= #argStr do
  311. local cc = argStr:sub(aPos, aPos)
  312. aStr = aStr .. cc .. ": level " .. aLevel .. ", end " .. aLChar .. "\n"
  313. if cc == "(" or cc == "{" then
  314. aLevel = aLevel + 1
  315. aLChar = aChars[cc]
  316. aCurrent = aCurrent .. cc
  317. elseif cc == aLChar then
  318. aLevel = aLevel - 1
  319. aCurrent = aCurrent .. cc
  320. aLChar = ""
  321. elseif cc == "," and aLevel == 0 then
  322. table.insert(args, aCurrent)
  323. --print("Arg: ", aCurrent)
  324. aCurrent = ""
  325. aPos = aPos + 1
  326. else
  327. aCurrent = aCurrent .. cc
  328. end
  329. --print(cc)
  330. aPos = aPos + 1
  331.  
  332. end
  333. --print(aStr)
  334. --print(table.concat(args, "; "))
  335. func[active](lvars, unpack(args))
  336. pos = str:find("%)%s-;", pos+1) + 1
  337. else
  338. local r, match = -1, ""
  339. for i, v in pairs(key) do
  340. local b, e = str:find(v, pos-1)
  341. if (b == pos) and e then
  342. if rank[i] > r then
  343. r = rank[i]
  344. match = i
  345. end
  346. end
  347. end
  348. if r == -1 then
  349. pos = pos + 1
  350. else
  351. --print("match")
  352. local b, e = str:find(key[match], pos-1)
  353. proc[match](lvars or {}, str:gmatch(key[match], pos-1)())
  354. pos = pos + e - b
  355. match = true
  356. end
  357. end
  358. --[[
  359. _LOG = (_LOG or "") .. str:sub(1, pos-1) .. "#" .. str:sub(pos+1, -1) .. "\n\n"
  360. saveProjectTab("Log", "--[=[" .. _LOG .. "--]=]")
  361. --]]
  362. end
  363. end
Advertisement
Add Comment
Please, Sign In to add comment