class RDoc::Markdown::Literals

characters, newlines and spaces.
Unlike peg-markdown, this set of literals recognizes Unicode alphanumeric
unicode support.
This set of literals is for Ruby 1.9 regular expressions and gives full
–
#

def self.rule_info(name, rendered)

def self.rule_info(name, rendered)
  RuleInfo.new(name, rendered)
end

def _Alphanumeric

Alphanumeric = /\p{Word}/
def _Alphanumeric
  _tmp = scan(/\A(?-mix:\p{Word})/)
  set_failed_rule :_Alphanumeric unless _tmp
  return _tmp
end

def _AlphanumericAscii

AlphanumericAscii = /[A-Za-z0-9]/
def _AlphanumericAscii
  _tmp = scan(/\A(?-mix:[A-Za-z0-9])/)
  set_failed_rule :_AlphanumericAscii unless _tmp
  return _tmp
end

def _BOM

BOM = "uFEFF"
def _BOM
  _tmp = match_string("uFEFF")
  set_failed_rule :_BOM unless _tmp
  return _tmp
end

def _Newline

Newline = /\n|\r\n?|\p{Zl}|\p{Zp}/
def _Newline
  _tmp = scan(/\A(?-mix:\n|\r\n?|\p{Zl}|\p{Zp})/)
  set_failed_rule :_Newline unless _tmp
  return _tmp
end

def _NonAlphanumeric

NonAlphanumeric = /\p{^Word}/
def _NonAlphanumeric
  _tmp = scan(/\A(?-mix:\p{^Word})/)
  set_failed_rule :_NonAlphanumeric unless _tmp
  return _tmp
end

def _Spacechar

Spacechar = /\t|\p{Zs}/
def _Spacechar
  _tmp = scan(/\A(?-mix:\t|\p{Zs})/)
  set_failed_rule :_Spacechar unless _tmp
  return _tmp
end

def apply(rule)

def apply(rule)
  if m = @memoizations[rule][@pos]
    @pos = m.pos
    if !m.set
      m.left_rec = true
      return nil
    end
    @result = m.result
    return m.ans
  else
    m = MemoEntry.new(nil, @pos)
    @memoizations[rule][@pos] = m
    start_pos = @pos
    ans = __send__ rule
    lr = m.left_rec
    m.move! ans, @pos, @result
    # Don't bother trying to grow the left recursion
    # if it's failing straight away (thus there is no seed)
    if ans and lr
      return grow_lr(rule, nil, start_pos, m)
    else
      return ans
    end
  end
end

def apply_with_args(rule, *args)

def apply_with_args(rule, *args)
  memo_key = [rule, args]
  if m = @memoizations[memo_key][@pos]
    @pos = m.pos
    if !m.set
      m.left_rec = true
      return nil
    end
    @result = m.result
    return m.ans
  else
    m = MemoEntry.new(nil, @pos)
    @memoizations[memo_key][@pos] = m
    start_pos = @pos
    ans = __send__ rule, *args
    lr = m.left_rec
    m.move! ans, @pos, @result
    # Don't bother trying to grow the left recursion
    # if it's failing straight away (thus there is no seed)
    if ans and lr
      return grow_lr(rule, args, start_pos, m)
    else
      return ans
    end
  end
end

def current_column(target=pos)

def current_column(target=pos)
  if c = string.rindex("\n", target-1)
    return target - c - 1
  end
  target + 1
end

def current_line(target=pos)

def current_line(target=pos)
  cur_offset = 0
  cur_line = 0
  string.each_line do |line|
    cur_line += 1
    cur_offset += line.size
    return cur_line if cur_offset >= target
  end
  -1
end

def external_invoke(other, rule, *args)

def external_invoke(other, rule, *args)
  old_pos = @pos
  old_string = @string
  set_string other.string, other.pos
  begin
    if val = __send__(rule, *args)
      other.pos = @pos
      other.result = @result
    else
      other.set_failed_rule "#{self.class}##{rule}"
    end
    val
  ensure
    set_string old_string, old_pos
  end
end

def failure_caret

def failure_caret
  l = current_line @failing_rule_offset
  c = current_column @failing_rule_offset
  line = lines[l-1]
  "#{line}\n#{' ' * (c - 1)}^"
end

def failure_character

def failure_character
  l = current_line @failing_rule_offset
  c = current_column @failing_rule_offset
  lines[l-1][c-1, 1]
end

def failure_info

def failure_info
  l = current_line @failing_rule_offset
  c = current_column @failing_rule_offset
  if @failed_rule.kind_of? Symbol
    info = self.class::Rules[@failed_rule]
    "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
  else
    "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
  end
end

def failure_oneline

def failure_oneline
  l = current_line @failing_rule_offset
  c = current_column @failing_rule_offset
  char = lines[l-1][c-1, 1]
  if @failed_rule.kind_of? Symbol
    info = self.class::Rules[@failed_rule]
    "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
  else
    "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
  end
end

def get_byte

def get_byte
  if @pos >= @string_size
    return nil
  end
  s = @string[@pos].ord
  @pos += 1
  s
end

def get_byte

def get_byte
  if @pos >= @string_size
    return nil
  end
  s = @string[@pos]
  @pos += 1
  s
end

def get_text(start)

def get_text(start)
  @string[start..@pos-1]
end

def grow_lr(rule, args, start_pos, m)

def grow_lr(rule, args, start_pos, m)
  while true
    @pos = start_pos
    @result = m.result
    if args
      ans = __send__ rule, *args
    else
      ans = __send__ rule
    end
    return nil unless ans
    break if @pos <= m.pos
    m.move! ans, @pos, @result
  end
  @result = m.result
  @pos = m.pos
  return m.ans
end

def initialize(str, debug=false)

parser setup code.
can redefine #initialize and still have access to the proper
This is distinct from setup_parser so that a standalone parser
def initialize(str, debug=false)
  setup_parser(str, debug)
end

def lines

def lines
  lines = []
  string.each_line { |l| lines << l }
  lines
end

def match_string(str)

def match_string(str)
  len = str.size
  if @string[pos,len] == str
    @pos += len
    return str
  end
  return nil
end

def parse(rule=nil)

def parse(rule=nil)
  # We invoke the rules indirectly via apply
  # instead of by just calling them as methods because
  # if the rules use left recursion, apply needs to
  # manage that.
  if !rule
    apply(:_root)
  else
    method = rule.gsub("-","_hyphen_")
    apply :"_#{method}"
  end
end

def raise_error

def raise_error
  raise ParseError, failure_oneline
end

def scan(reg)

def scan(reg)
  if m = reg.match(@string[@pos..-1])
    width = m.end(0)
    @pos += width
    return true
  end
  return nil
end

def set_failed_rule(name)

def set_failed_rule(name)
  if @pos > @failing_rule_offset
    @failed_rule = name
    @failing_rule_offset = @pos
  end
end

def set_string string, pos

Sets the string and current parsing position for the parser.
def set_string string, pos
  @string = string
  @string_size = string ? string.size : 0
  @pos = pos
end

def setup_foreign_grammar; end

:stopdoc:
:startdoc:
def setup_foreign_grammar; end

def setup_parser(str, debug=false)

call this method before #parse
Prepares for parsing +str+. If you define a custom initialize you must
def setup_parser(str, debug=false)
  set_string str, 0
  @memoizations = Hash.new { |h,k| h[k] = {} }
  @result = nil
  @failed_rule = nil
  @failing_rule_offset = -1
  setup_foreign_grammar
end

def show_error(io=STDOUT)

def show_error(io=STDOUT)
  error_pos = @failing_rule_offset
  line_no = current_line(error_pos)
  col_no = current_column(error_pos)
  io.puts "On line #{line_no}, column #{col_no}:"
  if @failed_rule.kind_of? Symbol
    info = self.class::Rules[@failed_rule]
    io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
  else
    io.puts "Failed to match rule '#{@failed_rule}'"
  end
  io.puts "Got: #{string[error_pos,1].inspect}"
  line = lines[line_no-1]
  io.puts "=> #{line}"
  io.print(" " * (col_no + 3))
  io.puts "^"
end

def show_pos

def show_pos
  width = 10
  if @pos < width
    "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
  else
    "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
  end
end