— lib/ruby_lexer.rb 2008-04-27 01:07:24.000000000 +0200 +++ lib/ruby_lexer.rb 2008-04-27 01:07:03.000000000 +0200 @@ -45,7 +45,7 @@
raise "bad val: #{str.inspect}" unless String === str self.file = file
self.lexer.src = StringIO.new(str)
+ self.lexer.src = RubyParser::StringIO.new(str)
@yydebug = ENV.has_key? 'DEBUG'
@@ -2604,104 +2604,106 @@
end end
-class StringIO # HACK: everything in here is a hack
attr_accessor :begin_of_line, :was_begin_of_line
alias :begin_of_line? :begin_of_line
alias :read_all :read
+class RubyParser + class StringIO < StringIO # HACK: everything in here is a hack + attr_accessor :begin_of_line, :was_begin_of_line + alias :begin_of_line? :begin_of_line + alias :read_all :read
alias :old_initialize :initialize
+ alias :old_initialize :initialize
def initialize(*args)
self.begin_of_line = true
self.was_begin_of_line = false
old_initialize(*args)
@original_string = self.string.dup
end
+ def initialize(*args) + self.begin_of_line = true + self.was_begin_of_line = false + old_initialize(*args) + @original_string = self.string.dup + end
def rest
end
+ def rest + self.string + end
def current_line # HAHA fuck you
@original_string[/A.*__LINE__/m].split(/n/).size
end
+ def current_line # HAHA fuck you + @original_string[/A.*__LINE__/m].split(/n/).size + end
def read
c = self.getc
+ def read + c = self.getc
if c == ?r then
d = self.getc
self.ungetc d if d and d != ?n
c = ?n
end
+ if c == ?r then + d = self.getc + self.ungetc d if d and d != ?n + c = ?n + end
self.was_begin_of_line = self.begin_of_line
self.begin_of_line = c == ?n
if c and c != 0 then
c.chr
else
::RubyLexer::EOF
+ self.was_begin_of_line = self.begin_of_line + self.begin_of_line = c == ?n + if c and c != 0 then + c.chr + else + ::RubyLexer::EOF + end
end
end
def match_string term, indent=false # TODO: add case insensitivity, or just remove
buffer = []
+ def match_string term, indent=false # TODO: add case insensitivity, or just remove + buffer = []
if indent
while c = self.read do
if c !~ /s/ or c == “n” or c == “r” then
self.unread c
break
+ if indent + while c = self.read do + if c !~ /s/ or c == “n” or c == “r” then + self.unread c + break + end + buffer << c
end
buffer << c
end
end
term.each_byte do |c2|
c = self.read
c = self.read if c and c == “r”
buffer << c
if c and c2 != c then
self.unread_many buffer.join # HACK omg
return false
+ term.each_byte do |c2| + c = self.read + c = self.read if c and c == “r” + buffer << c + if c and c2 != c then + self.unread_many buffer.join # HACK omg + return false + end
end
+ + return true
end
return true
end
+ def read_line + self.begin_of_line = true + self.was_begin_of_line = false + gets.sub(/rn?$/, “n”) # HACK + end
def read_line
self.begin_of_line = true
self.was_begin_of_line = false
gets.sub(/rn?$/, “n”) # HACK
end
-
def peek expected = nil # FIX: barf
c = self.getc
return RubyLexer::EOF if c.nil?
self.ungetc c if c
c = c.chr if c
if expected then
c == expected
else
c
+ def peek expected = nil # FIX: barf + c = self.getc + return RubyLexer::EOF if c.nil? + self.ungetc c if c + c = c.chr if c + if expected then + c == expected + else + c + end
end
end
def unread©
return if c.nil? # UGH
+ def unread© + return if c.nil? # UGH
# HACK: only depth is 2… who cares? really I want to remove all of this
self.begin_of_line = self.was_begin_of_line || true
self.was_begin_of_line = nil
+ # HACK: only depth is 2… who cares? really I want to remove all of this + self.begin_of_line = self.was_begin_of_line || true + self.was_begin_of_line = nil
c = c if String === c
self.ungetc c
end
+ c = c if String === c + self.ungetc c + end
def unread_many str
str.split(//).reverse.each do |c|
unread c
+ def unread_many str + str.split(//).reverse.each do |c| + unread c + end
end end end