class ActionDispatch::Journey::Parser
:nodoc:
:nodoc:
def self.parse(string)
def self.parse(string) new.parse string end
def advance_token
def advance_token @next_token = @scanner.next_token end
def do_parse
def do_parse parse_expressions end
def initialize
def initialize @scanner = Scanner.new @next_token = nil end
def parse(string)
def parse(string) @scanner.scan_setup(string) advance_token do_parse end
def parse_expression
def parse_expression if @next_token == :STAR parse_star elsif @next_token == :LPAREN parse_group else parse_terminal end end
def parse_expressions
def parse_expressions node = parse_expression while @next_token case @next_token when :RPAREN break when :OR node = parse_or(node) else node = Cat.new(node, parse_expressions) end end node end
def parse_group
def parse_group advance_token node = parse_expressions if @next_token == :RPAREN node = Group.new(node) advance_token node else raise ArgumentError, "missing right parenthesis." end end
def parse_or(lhs)
def parse_or(lhs) advance_token node = parse_expression Or.new([lhs, node]) end
def parse_star
def parse_star node = Star.new(Symbol.new(@scanner.last_string, Symbol::GREEDY_EXP)) advance_token node end
def parse_terminal
def parse_terminal node = case @next_token when :SYMBOL Symbol.new(@scanner.last_string) when :LITERAL Literal.new(@scanner.last_literal) when :SLASH Slash.new("/") when :DOT Dot.new(".") end advance_token node end