Skip to content

Instantly share code, notes, and snippets.

@ebisawa
Created September 10, 2010 05:11
Show Gist options
  • Save ebisawa/573139 to your computer and use it in GitHub Desktop.
Save ebisawa/573139 to your computer and use it in GitHub Desktop.
PHP data parser
class PhpDataParser
def initialize(data_string)
@tokens = []
lines = data_string.split("\n")
lines.each do |line|
line.gsub!(%r{//.*$}, '')
@tokens.concat(line.split(/\s+|(=>)/))
end
end
def get_token
loop do
t = @tokens.shift
return t if t != ""
end
end
def syntax_error(msg)
puts "ERROR: #{msg}"
abort
end
def dequote(string)
return $1 if string =~ /^'(.+)',?$/
return $1 if string =~ /^"(.+)",?$/
return string
end
def parse_array_elem(key)
return nil if key == ','
return dequote($1) if key =~ /(.+),$/
assoc = get_token
case assoc
when ","
return dequote(key)
when "=>"
# ok
else
syntax_error("parse_array_elem: unexpected token '#{assoc}'")
end
{ dequote(key) => parse_value }
end
def parse_array
a = []; h = {}
while t = get_token
break if t =~ /^\)/
r = parse_array_elem(t)
a.push(r) if r.class == Array
h.merge!(r) if r.class == Hash
end
return a if a.size > 0
return h
end
def parse_value
t = get_token
return dequote(t) if t != 'array('
return parse_array
end
def parse
while t = get_token
if t == "$db_config_list"
if get_token == "="
return parse_value
end
end
end
{}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment