# File lib/rouge/regex_lexer.rb, line 65 def appended(&defn) parent_defn = @defn StateDSL.new(@name) do instance_eval(&parent_defn) instance_eval(&defn) end end
Mix in the rules from another state into this state. The rules from the mixed-in state will be tried in order before moving on to the rest of the rules in this state.
# File lib/rouge/regex_lexer.rb, line 128 def mixin(state) rules << state.to_s end
Define a new rule for this state.
@overload rule(re, token, next_state=nil) @overload rule(re, &callback)
@param [Regexp] re
a regular expression for this rule to test.
@param [String] tok
the token type to yield if `re` matches.
@param [to_s] next_state
(optional) a state to push onto the stack if `re` matches. If `next_state` is `:pop!`, the state stack will be popped instead.
@param [Proc] callback
a block that will be evaluated in the context of the lexer if `re` matches. This block has access to a number of lexer methods, including {RegexLexer#push}, {RegexLexer#pop!}, {RegexLexer#token}, and {RegexLexer#delegate}. The first argument can be used to access the match groups.
# File lib/rouge/regex_lexer.rb, line 93 def rule(re, tok=nil, next_state=nil, &callback) 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 " 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 else proc do |stream| puts " yielding #{tok.qualname}, #{stream[0].inspect}" if @debug @output_stream.call(tok, stream[0]) end end rules << Rule.new(re, callback) end
Generated with the Darkfish Rdoc Generator 2.