mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
61 lines
1.2 KiB
Ruby
61 lines
1.2 KiB
Ruby
require 'strscan'
|
|
|
|
module ActionDispatch
|
|
module Journey # :nodoc:
|
|
class Scanner # :nodoc:
|
|
def initialize
|
|
@ss = nil
|
|
end
|
|
|
|
def scan_setup(str)
|
|
@ss = StringScanner.new(str)
|
|
end
|
|
|
|
def eos?
|
|
@ss.eos?
|
|
end
|
|
|
|
def pos
|
|
@ss.pos
|
|
end
|
|
|
|
def pre_match
|
|
@ss.pre_match
|
|
end
|
|
|
|
def next_token
|
|
return if @ss.eos?
|
|
|
|
until token = scan || @ss.eos?; end
|
|
token
|
|
end
|
|
|
|
private
|
|
|
|
def scan
|
|
case
|
|
# /
|
|
when text = @ss.scan(/\//)
|
|
[:SLASH, text]
|
|
when text = @ss.scan(/\*\w+/)
|
|
[:STAR, text]
|
|
when text = @ss.scan(/\(/)
|
|
[:LPAREN, text]
|
|
when text = @ss.scan(/\)/)
|
|
[:RPAREN, text]
|
|
when text = @ss.scan(/\|/)
|
|
[:OR, text]
|
|
when text = @ss.scan(/\./)
|
|
[:DOT, text]
|
|
when text = @ss.scan(/:\w+/)
|
|
[:SYMBOL, text]
|
|
when text = @ss.scan(/[\w%\-~]+/)
|
|
[:LITERAL, text]
|
|
# any char
|
|
when text = @ss.scan(/./)
|
|
[:LITERAL, text]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|