From 84b8431608174e74a4c0d2394eb330a6621bc74b Mon Sep 17 00:00:00 2001 From: no author Date: Mon, 26 Sep 2005 02:58:54 +0000 Subject: New Repository, initial import --- lib/coderay/scanners/rubylex.rb | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 lib/coderay/scanners/rubylex.rb (limited to 'lib/coderay/scanners/rubylex.rb') diff --git a/lib/coderay/scanners/rubylex.rb b/lib/coderay/scanners/rubylex.rb new file mode 100644 index 0000000..2e69d39 --- /dev/null +++ b/lib/coderay/scanners/rubylex.rb @@ -0,0 +1,102 @@ +require 'rubygems' +require_gem 'rubylexer' +require 'rubylexer.rb' + +module CodeRay module Scanners + + class RubyLex < Scanner + + register_for :rubylex + + class FakeFile < String + + def initialize(*) + super + @pos = 0 + end + + attr_accessor :pos + + def read x + pos = @pos + @pos += x + self[pos ... @pos] + end + + def getc + pos = @pos + @pos += 1 + self[pos]||-1 + end + + def eof? + @pos == size + end + + def each_byte + until eof? + yield getc + end + end + + def method_missing meth, *args + raise NoMethodError, '%s%s' % [meth, args] + end + + end + + private + Translate = { + :ignore => :comment, + :varname => :ident, + :number => :integer, + :ws => :space, + :escnl => :space, + :keyword => :reserved, + :methname => :method, + :renderexactlystring => :regexp, + :string => :string, + } + + def scan_tokens tokens, options + require 'tempfile' + Tempfile.open('~coderay_tempfile') do |file| + file.binmode + file.write code + file.rewind + lexer = RubyLexer.new 'code', file + loop do + begin + tok = lexer.get1token + rescue => kaboom + err = <<-EOE + ERROR!!! +#{kaboom.inspect} +#{kaboom.backtrace.join("\n")} + EOE + tokens << [err, :error] + Kernel.raise + end + break if tok.is_a? EoiToken + next if tok.is_a? FileAndLineToken + kind = tok.class.name[/(.*?)Token$/,1].downcase.to_sym + kind = Translate.fetch kind, kind + text = tok.ident + case kind + when :hereplaceholder + text = tok.ender + kind = :string + when :herebody, :outlinedherebody + text = tok.ident.ident + kind = :string + end + text = text.inspect unless text.is_a? String + p token if kind == :error + tokens << [text.dup, kind] + end + end + tokens + end + end + +end end -- cgit v1.2.1