blob: 0ff7f67661787e2b07a5368f8e1118745176c709 (
plain) (
tree)
|
|
#--
# DO NOT MODIFY!!!!
# This file is automatically generated by rex 1.0.5.beta1
# from lexical definition file "lib/rack/mount/strexp/tokenizer.rex".
#++
require 'racc/parser'
class Rack::Mount::StrexpParser < Racc::Parser
require 'strscan'
class ScanError < StandardError ; end
attr_reader :lineno
attr_reader :filename
attr_accessor :state
def scan_setup(str)
@ss = StringScanner.new(str)
@lineno = 1
@state = nil
end
def action
yield
end
def scan_str(str)
scan_setup(str)
do_parse
end
alias :scan :scan_str
def load_file( filename )
@filename = filename
open(filename, "r") do |f|
scan_setup(f.read)
end
end
def scan_file( filename )
load_file(filename)
do_parse
end
def next_token
return if @ss.eos?
text = @ss.peek(1)
@lineno += 1 if text == "\n"
token = case @state
when nil
case
when (text = @ss.scan(/\\(\(|\)|:|\*)/))
action { [:CHAR, @ss[1]] }
when (text = @ss.scan(/\:([a-zA-Z_]\w*)/))
action { [:PARAM, @ss[1]] }
when (text = @ss.scan(/\*([a-zA-Z_]\w*)/))
action { [:GLOB, @ss[1]] }
when (text = @ss.scan(/\(/))
action { [:LPAREN, text] }
when (text = @ss.scan(/\)/))
action { [:RPAREN, text] }
when (text = @ss.scan(/./))
action { [:CHAR, text] }
else
text = @ss.string[@ss.pos .. -1]
raise ScanError, "can not match: '" + text + "'"
end # if
else
raise ScanError, "undefined state: '" + state.to_s + "'"
end # case state
token
end # def next_token
end # class
|