class Aspen::AbstractParser

Attributes

position[R]
tokens[R]

Public Class Methods

new(tokens, env={}) click to toggle source
# File lib/aspen/abstract_parser.rb, line 16
def initialize(tokens, env={})
  @tokens = tokens
  # Nothing is done with environment in the parser.
  # Calling #next will start at 0
  @position = 0
end
parse(tokens, env={}) click to toggle source
# File lib/aspen/abstract_parser.rb, line 4
def self.parse(tokens, env={})
  new(tokens).parse
end
parse_code(code, env={}, lexer=Aspen::Lexer) click to toggle source

Convenience method

# File lib/aspen/abstract_parser.rb, line 9
def self.parse_code(code, env={}, lexer=Aspen::Lexer)
  tokens = lexer.tokenize(code, env)
  parse(tokens, env)
end

Public Instance Methods

expect(*expected_tokens) click to toggle source
# File lib/aspen/abstract_parser.rb, line 23
def expect(*expected_tokens)
  upcoming = tokens[position, expected_tokens.size]

  if upcoming.map(&:first) == expected_tokens
    advance_by expected_tokens.size
    upcoming
  end
end
first() click to toggle source
# File lib/aspen/abstract_parser.rb, line 39
def first
  tokens.first
end
last() click to toggle source
# File lib/aspen/abstract_parser.rb, line 43
def last
  tokens.last
end
need(*required_tokens) click to toggle source
# File lib/aspen/abstract_parser.rb, line 32
    def need(*required_tokens)
      upcoming = tokens[position, required_tokens.size]
      expect(*required_tokens) or raise Aspen::ParseError, <<~ERROR
        Unexpected tokens. Expected #{required_tokens.inspect} but got #{upcoming.inspect}
      ERROR
    end
next_token() click to toggle source
# File lib/aspen/abstract_parser.rb, line 47
def next_token
  t = tokens[position]
  advance
  return t
end
peek(offset = 0) click to toggle source
# File lib/aspen/abstract_parser.rb, line 53
def peek(offset = 0)
  if offset > 0
    tokens[position + 1..position + offset]
  else
    tokens[position]
  end
end

Private Instance Methods

advance() click to toggle source
# File lib/aspen/abstract_parser.rb, line 63
def advance
  advance_by 1
end
advance_by(offset = 1) click to toggle source
# File lib/aspen/abstract_parser.rb, line 67
def advance_by(offset = 1)
  @position += offset
end