66 lines
1.1 KiB
Ruby
66 lines
1.1 KiB
Ruby
module AS; end
|
|
|
|
if (not defined? RUBY_ENGINE or not RUBY_ENGINE == 'rbx')
|
|
class Regexp
|
|
def match_start(str, idx)
|
|
Regexp.compile('\A(?:'+source+')').match(str[idx..-1])
|
|
end
|
|
end
|
|
end
|
|
|
|
class Asm::Scanner
|
|
def initialize(str)
|
|
@string = str
|
|
@pos = 0
|
|
@line = 0
|
|
@column = 0
|
|
end
|
|
attr_accessor :string, :pos, :line, :column, :prev_line, :prev_column
|
|
|
|
def rest
|
|
string[pos..-1]
|
|
end
|
|
|
|
def advance_str(str)
|
|
self.prev_line = line
|
|
self.prev_column = column
|
|
self.pos += str.length
|
|
self.line += str.count("\n")
|
|
if (str.include?("\n"))
|
|
self.column = str.length - str.rindex("\n")
|
|
else
|
|
self.column += str.length
|
|
end
|
|
end
|
|
|
|
def scan(regexp)
|
|
if (match = regexp.match_start(rest, 0))
|
|
advance_str match.to_s
|
|
match.captures
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def scan_str(regexp)
|
|
if (match = regexp.match_start(rest, 0))
|
|
advance_str match.to_s
|
|
match.to_s
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def lookahead(regexp)
|
|
if (match = regexp.match_start(rest, 0))
|
|
true
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
def eos?
|
|
pos == string.length
|
|
end
|
|
end
|