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
|