Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class CommandParser
- def self.snippet(str)
- self.parse(self.lex(str))
- end
- def self.lex(str)
- tokens = []
- while !(str.nil? || str.empty?)
- case str
- when /\A(?:\w|\.)+\(/
- tokens << [:fun_begin,$&]
- when /\A[\w.]+\s*<?=\s*/
- tokens << [:assignment,$&]
- when /\A[$\w.]+(?=,|)/
- tokens << [:term,$&]
- when /\A\.\.\./
- tokens << [:term,$&]
- when /\A,\s*/
- tokens << [:comma,$&]
- when /\A\)/
- tokens << [:fun_end,$&]
- when /\A".*?(?!\\)"/
- tokens << [:quoted,$&]
- when /\A\s*([\+\-\*\/!^]|&&|\|\|)\s*/
- tokens << [:operator,$&]
- when /\A\d+(\.\d+)?/
- tokens << [:number,$&]
- when /\A\{/
- tokens << [:brace_begin,$&]
- when /\A\}/
- tokens << [:brace_end,$&]
- when /\A\[/
- tokens << [:bracket_begin,$&]
- when /\A\]/
- tokens << [:bracket_end,$&]
- when /\A:/
- tokens << [:list_separator,$&]
- when /\s+/
- else
- pp str
- raise "Could not process: " + str
- end
- str = $'
- end
- tokens
- end
- def self.parse(datum)
- str = ""
- snippet_counter = -1
- datum.each do |type,match|
- # pp type,match
- case type
- when :fun_begin, :brace_begin, :bracket_begin
- str << ("${#{snippet_counter+=1}:#{match}${#{snippet_counter+=1}:")
- when :assignment
- str << match << "${#{snippet_counter+=1}:"
- when :comma
- str << "}${#{snippet_counter+=1}:" << match
- when :brace_end, :bracket_end, :fun_end
- str << "}" << match << "}"
- when :quoted
- str << "${#{snippet_counter+=1}:\"${#{snippet_counter+=1}:#{match[1..-2].gsub("}","\\}")}}\"}"
- else
- str << match
- end
- end
- str[4..-2]
- end
- end
Add Comment
Please, Sign In to add comment