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 = []
- until 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(data)
- str = ""
- snippet_counter = -1
- stack = [[:expression,""]]
- until data.empty?
- type,match = data.shift
- if !stack.empty? && stack.last[0] == :assignment && type.to_s =~ /comma|end$/ then
- temp_str = stack.pop[1]
- stack.last[1] += (temp_str + "}")
- end
- case type
- when :fun_begin, :brace_begin, :bracket_begin
- stack << [:group, ("${#{snippet_counter+=1}:#{match}${#{snippet_counter+=1}:")] << [:expression,""]
- when :assignment
- stack << [:assignment, "#{match}${#{snippet_counter+=1}:"]
- when :comma
- stack.last[1] += ("}${#{snippet_counter+=1}:" + match)
- when :brace_end, :bracket_end, :fun_end
- the_end = stack.pop[1] + ( "}#{match}}")
- the_whole = stack.pop[1] + the_end
- stack.last[1] += the_whole
- when :quoted
- stack.last[1] += "${#{snippet_counter+=1}:\"${#{snippet_counter+=1}:#{match[1..-2].gsub("}","\\}")}}\"}"
- else
- stack.last[1] += match
- end
- end
- raise "Too many levels" unless stack.length == 1
- stack[0][1][4..-2]
- end
- end
- require 'pp'
- data=DATA.read.split("\n")
- 5.times do
- d = data[rand(2000)]
- pp [d, CommandParser.snippet(d)]
- end
Add Comment
Please, Sign In to add comment