Guest User

Untitled

a guest
Feb 20th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. class CommandParser
  2. def self.snippet(str)
  3. self.parse(self.lex(str))
  4. end
  5. def self.lex(str)
  6. tokens = []
  7. until str.nil? || str.empty?
  8. case str
  9. when /\A(?:\w|\.)+\(/
  10. tokens << [:fun_begin,$&]
  11. when /\A[\w.]+\s*<?=\s*/
  12. tokens << [:assignment,$&]
  13. when /\A[$\w.]+(?=,|)/
  14. tokens << [:term,$&]
  15. when /\A\.\.\./
  16. tokens << [:term,$&]
  17. when /\A,\s*/
  18. tokens << [:comma,$&]
  19. when /\A\)/
  20. tokens << [:fun_end,$&]
  21. when /\A".*?(?!\\)"/
  22. tokens << [:quoted,$&]
  23. when /\A\s*([\+\-\*\/!^]|&&|\|\|)\s*/
  24. tokens << [:operator,$&]
  25. when /\A\d+(\.\d+)?/
  26. tokens << [:number,$&]
  27. when /\A\{/
  28. tokens << [:brace_begin,$&]
  29. when /\A\}/
  30. tokens << [:brace_end,$&]
  31. when /\A\[/
  32. tokens << [:bracket_begin,$&]
  33. when /\A\]/
  34. tokens << [:bracket_end,$&]
  35. when /\A:/
  36. tokens << [:list_separator,$&]
  37. when /\s+/
  38. else
  39. pp str
  40. raise "Could not process: " + str
  41. end
  42. str = $'
  43. end
  44. tokens
  45. end
  46. def self.parse(data)
  47. str = ""
  48. snippet_counter = -1
  49. stack = [[:expression,""]]
  50. until data.empty?
  51. type,match = data.shift
  52. if !stack.empty? && stack.last[0] == :assignment && type.to_s =~ /comma|end$/ then
  53. temp_str = stack.pop[1]
  54. stack.last[1] += (temp_str + "}")
  55. end
  56. case type
  57. when :fun_begin, :brace_begin, :bracket_begin
  58. stack << [:group, ("${#{snippet_counter+=1}:#{match}${#{snippet_counter+=1}:")] << [:expression,""]
  59. when :assignment
  60. stack << [:assignment, "#{match}${#{snippet_counter+=1}:"]
  61. when :comma
  62. stack.last[1] += ("}${#{snippet_counter+=1}:" + match)
  63. when :brace_end, :bracket_end, :fun_end
  64. the_end = stack.pop[1] + ( "}#{match}}")
  65. the_whole = stack.pop[1] + the_end
  66. stack.last[1] += the_whole
  67. when :quoted
  68. stack.last[1] += "${#{snippet_counter+=1}:\"${#{snippet_counter+=1}:#{match[1..-2].gsub("}","\\}")}}\"}"
  69. else
  70. stack.last[1] += match
  71. end
  72. end
  73. raise "Too many levels" unless stack.length == 1
  74. stack[0][1][4..-2]
  75. end
  76. end
  77. require 'pp'
  78. data=DATA.read.split("\n")
  79. 5.times do
  80. d = data[rand(2000)]
  81. pp [d, CommandParser.snippet(d)]
  82. end
Add Comment
Please, Sign In to add comment