Guest User

Untitled

a guest
Feb 20th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 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. while !(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(datum)
  47. str = ""
  48. snippet_counter = -1
  49. datum.each do |type,match|
  50. # pp type,match
  51. case type
  52. when :fun_begin, :brace_begin, :bracket_begin
  53. str << ("${#{snippet_counter+=1}:#{match}${#{snippet_counter+=1}:")
  54. when :assignment
  55. str << match << "${#{snippet_counter+=1}:"
  56. when :comma
  57. str << "}${#{snippet_counter+=1}:" << match
  58. when :brace_end, :bracket_end, :fun_end
  59. str << "}" << match << "}"
  60. when :quoted
  61. str << "${#{snippet_counter+=1}:\"${#{snippet_counter+=1}:#{match[1..-2].gsub("}","\\}")}}\"}"
  62. else
  63. str << match
  64. end
  65. end
  66. str[4..-2]
  67. end
  68. end
Add Comment
Please, Sign In to add comment