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)
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)
-
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