Lua scripts and notes for programming within Minetest.

tokenize.lua 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. -- things between spaces, () separate depths
  2. local tokenize
  3. tokenize = function(str)
  4. if not str then return nil end
  5. local ast = {}
  6. local open = str:find("(", 0, true) or math.huge
  7. local close = str:find(")", 0, true) or math.huge
  8. local space = str:find(" ", 0, true) or math.huge
  9. local ret
  10. if open < close and open < space then
  11. -- tokenize what came before (call on substring, unpack here), call tokenize on what comes after
  12. ret = tokenize(str:sub(1, open - 1))
  13. if ret then
  14. while #ret > 0 do
  15. table.insert(ast, table.remove(ret, 1))
  16. end
  17. end
  18. ret, str = tokenize(str:sub(open + 1))
  19. if ret and #ret > 0 then
  20. table.insert(ast, ret)
  21. end
  22. ret = tokenize(str)
  23. if ret then
  24. while #ret > 0 do
  25. table.insert(ast, table.remove(ret, 1))
  26. end
  27. end
  28. return ast
  29. elseif close < open and close < space then
  30. return ast, str:sub(close + 1)
  31. elseif space < open and space < close then
  32. ret = str:sub(1, space - 1)
  33. if ret and #ret > 0 then
  34. table.insert(ast, ret)
  35. end
  36. ret, str = tokenize(str:sub(space + 1))
  37. if ret and #ret > 0 then
  38. table.insert(ast, ret)
  39. end
  40. ret = tokenize(str)
  41. if ret then
  42. while #ret > 0 do
  43. table.insert(ast, table.remove(ret, 1))
  44. end
  45. end
  46. return ast
  47. else
  48. table.insert(ast, str:sub(1, space - 1))
  49. return ast
  50. end
  51. end
  52. local ptable
  53. ptable = function(tab, depth)
  54. local str = ""
  55. depth = depth or 0
  56. if "table" == type(tab) then
  57. for k,v in pairs(tab) do
  58. str = str .. string.rep(" ", depth) .. ptable(k, depth) .. "\n"
  59. str = str .. string.rep(" ", depth) .. ptable(v, depth + 1) .. "\n"
  60. end
  61. else
  62. return tostring(tab)
  63. end
  64. return str
  65. end
  66. local a = "(echo (: 'value' ($ name)))"
  67. ast = tokenize(a)
  68. print(ptable(ast))