class Rouge::RegexLexer::StateDSL

def appended(&defn)

def appended(&defn)
  parent_defn = @defn
  StateDSL.new(@name) do
    instance_eval(&parent_defn)
    instance_eval(&defn)
  end
end

def initialize(name, &defn)

def initialize(name, &defn)
  @name = name
  @defn = defn
  @rules = []
end

def load!

def load!
  return if @loaded
  @loaded = true
  instance_eval(&@defn)
end

def mixin(state)

to the rest of the rules in this state.
from the mixed-in state will be tried in order before moving on
Mix in the rules from another state into this state. The rules
def mixin(state)
  rules << state.to_s
end

def prepended(&defn)

def prepended(&defn)
  parent_defn = @defn
  StateDSL.new(@name) do
    instance_eval(&defn)
    instance_eval(&parent_defn)
  end
end

def rule(re, tok=nil, next_state=nil, &callback)

Parameters:
  • callback (Proc) --
  • next_state (#to_s) --
  • tok (String) --
  • re (Regexp) --

Overloads:
  • rule(re, &callback)
  • rule(re, token, next_state=nil)
def rule(re, tok=nil, next_state=nil, &callback)
  if tok.nil? && callback.nil?
    raise "please pass `rule` a token to yield or a callback"
  end
  callback ||= case next_state
  when :pop!
    proc do |stream|
      puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
      @output_stream.call(tok, stream[0])
      puts "    popping stack: #{1}" if @debug
      @stack.pop or raise 'empty stack!'
    end
  when :push
    proc do |stream|
      puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
      @output_stream.call(tok, stream[0])
      puts "    pushing #{@stack.last.name}" if @debug
      @stack.push(@stack.last)
    end
  when Symbol
    proc do |stream|
      puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
      @output_stream.call(tok, stream[0])
      state = @states[next_state] || self.class.get_state(next_state)
      puts "    pushing #{state.name}" if @debug
      @stack.push(state)
    end
  when nil
    proc do |stream|
      puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
      @output_stream.call(tok, stream[0])
    end
  else
    raise "invalid next state: #{next_state.inspect}"
  end
  rules << Rule.new(re, callback)
end

def to_state(lexer_class)

def to_state(lexer_class)
  load!
  rules = @rules.map do |rule|
    rule.is_a?(String) ? lexer_class.get_state(rule) : rule
  end
  State.new(@name, rules)
end