$escapeTable = { "a" => 0x07, # Bell "b" => 0x08, # Backspace "e" => 0x1b, # Escape "f" => 0x0c, # Formfeed "n" => 0x0a, # New Line "r" => 0x0d, # Carriage Return "s" => 0x20, # Space "t" => 0x09, # Tab "v" => 0x0b, # Vertical Tab "\\" => "\\" # BackSlash } def escapeExists(c) return $escapeTable.has_key?(c) end def escapeInHex(c) return $escapeTable[c] end def comment(input) return input.gets end def parseString(input, stopAt, extra) str = "" while (c2 = input.getc) c = c2.chr if(c == stopAt) break elsif(c == "\\") c2 = input.getc if(!c2) break elsif(escapeExists(c2.chr)) str << escapeInHex(c2.chr) elsif(extra && c2.chr =~ /[0-7]/) print "octal parsing not yet implemented" str << c + c2.chr elsif(extra && c2.chr =~ /[xX]/) print "hex parsing not yet implemented" str << c + c2.chr elsif(extra && c2.chr =~ "[cC]") print "control parsing not yet implemented" str << c + c2.chr elsif(extra && c2.chr == "M") print "Meta parsing not yet implemented" str << c + c2.chr elsif(extra && c2.chr == "M") print "Meta-control parsing not yet implemented" str << c + c2.chr elsif(extra && c2.chr == "{") print "expression parsing not yet implemented" str << c + c2.chr else str << c + c2.chr end else str << c end end return str end def parse(input) body = "" strings = [] comments = [] while (ch = input.getc) case ch when ?# body << "#comments[#{comments.size}]\n" comments << comment(input) when ?' body << "strings[#{strings.size}]" strings << parseString(input, "'", false) when ?" body << "strings[#{strings.size}]" strings << parseString(input, '"', true) else body << ch end end print "\nstrings: #{strings.size}\n", strings.inspect print "\ncomments: #{comments.size}\n", comments.inspect, "\n" print body print "\n" end aFile = File.open("riddle.rb", "r") parse(aFile)