Class CodeRay::Scanners::Scheme
In: lib/coderay/scanners/scheme.rb
Parent: Scanner

Scheme scanner for CodeRay (by closure). Thanks to murphy for putting CodeRay into public.

Methods

Constants

CORE_FORMS = %w[ lambda let let* letrec syntax-case define-syntax let-syntax letrec-syntax begin define quote if or and cond case do delay quasiquote set! cons force call-with-current-continuation call/cc ]
IDENT_KIND = CaseIgnoringWordList.new(:ident). add(CORE_FORMS, :reserved)
IDENTIFIER = /[a-zA-Z!@$%&*\/:<=>?~_^][\w!@$%&*\/:<=>?~^.+\-]*|[+-]|\.\.\./   IDENTIFIER_INITIAL = /[a-z!@\$%&*\/\:<=>\?~_\^]/i IDENTIFIER_SUBSEQUENT = /#{IDENTIFIER_INITIAL}|\d|\.|+|-/ IDENTIFIER = /#{IDENTIFIER_INITIAL}#{IDENTIFIER_SUBSEQUENT}*|+|-|\.{3}/
DIGIT = /\d/
DIGIT10 = DIGIT
DIGIT16 = /[0-9a-f]/i
DIGIT8 = /[0-7]/
DIGIT2 = /[01]/
RADIX16 = /\#x/i
RADIX8 = /\#o/i
RADIX2 = /\#b/i
RADIX10 = /\#d/i
EXACTNESS = /#i|#e/i
SIGN = /[\+-]?/
EXP_MARK = /[esfdl]/i
EXP = /#{EXP_MARK}#{SIGN}#{DIGIT}+/
SUFFIX = /#{EXP}?/
PREFIX10 = /#{RADIX10}?#{EXACTNESS}?|#{EXACTNESS}?#{RADIX10}?/
PREFIX16 = /#{RADIX16}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX16}/
PREFIX8 = /#{RADIX8}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX8}/
PREFIX2 = /#{RADIX2}#{EXACTNESS}?|#{EXACTNESS}?#{RADIX2}/
UINT10 = /#{DIGIT10}+#*/
UINT16 = /#{DIGIT16}+#*/
UINT8 = /#{DIGIT8}+#*/
UINT2 = /#{DIGIT2}+#*/
DECIMAL = /#{DIGIT10}+#+\.#*#{SUFFIX}|#{DIGIT10}+\.#{DIGIT10}*#*#{SUFFIX}|\.#{DIGIT10}+#*#{SUFFIX}|#{UINT10}#{EXP}/
UREAL10 = /#{UINT10}\/#{UINT10}|#{DECIMAL}|#{UINT10}/
UREAL16 = /#{UINT16}\/#{UINT16}|#{UINT16}/
UREAL8 = /#{UINT8}\/#{UINT8}|#{UINT8}/
UREAL2 = /#{UINT2}\/#{UINT2}|#{UINT2}/
REAL10 = /#{SIGN}#{UREAL10}/
REAL16 = /#{SIGN}#{UREAL16}/
REAL8 = /#{SIGN}#{UREAL8}/
REAL2 = /#{SIGN}#{UREAL2}/
IMAG10 = /i|#{UREAL10}i/
IMAG16 = /i|#{UREAL16}i/
IMAG8 = /i|#{UREAL8}i/
IMAG2 = /i|#{UREAL2}i/
COMPLEX10 = /#{REAL10}@#{REAL10}|#{REAL10}\+#{IMAG10}|#{REAL10}-#{IMAG10}|\+#{IMAG10}|-#{IMAG10}|#{REAL10}/
COMPLEX16 = /#{REAL16}@#{REAL16}|#{REAL16}\+#{IMAG16}|#{REAL16}-#{IMAG16}|\+#{IMAG16}|-#{IMAG16}|#{REAL16}/
COMPLEX8 = /#{REAL8}@#{REAL8}|#{REAL8}\+#{IMAG8}|#{REAL8}-#{IMAG8}|\+#{IMAG8}|-#{IMAG8}|#{REAL8}/
COMPLEX2 = /#{REAL2}@#{REAL2}|#{REAL2}\+#{IMAG2}|#{REAL2}-#{IMAG2}|\+#{IMAG2}|-#{IMAG2}|#{REAL2}/
NUM10 = /#{PREFIX10}?#{COMPLEX10}/
NUM16 = /#{PREFIX16}#{COMPLEX16}/
NUM8 = /#{PREFIX8}#{COMPLEX8}/
NUM2 = /#{PREFIX2}#{COMPLEX2}/
NUM = /#{NUM10}|#{NUM16}|#{NUM8}|#{NUM2}/

Private Instance methods

[Source]

     # File lib/coderay/scanners/scheme.rb, line 70
 70:       def scan_tokens tokens,options
 71:         
 72:         state = :initial
 73:         ident_kind = IDENT_KIND
 74:         
 75:         until eos?
 76:           kind = match = nil
 77:           
 78:           case state
 79:           when :initial
 80:             if scan(/ \s+ | \\\n /x)
 81:               kind = :space
 82:             elsif scan(/['\(\[\)\]]|#\(/)
 83:               kind = :operator_fat
 84:             elsif scan(/;.*/)
 85:               kind = :comment
 86:             elsif scan(/#\\(?:newline|space|.?)/)
 87:               kind = :char
 88:             elsif scan(/#[ft]/)
 89:               kind = :pre_constant
 90:             elsif scan(/#{IDENTIFIER}/o)
 91:               kind = ident_kind[matched]
 92:             elsif scan(/\./)
 93:               kind = :operator
 94:             elsif scan(/"/)
 95:               tokens << [:open, :string]
 96:               state = :string
 97:               tokens << ['"', :delimiter]
 98:               next
 99:             elsif scan(/#{NUM}/o) and not matched.empty?
100:               kind = :integer
101:             elsif getch
102:               kind = :error
103:             end
104:             
105:           when :string
106:             if scan(/[^"\\]+/) or scan(/\\.?/)
107:               kind = :content
108:             elsif scan(/"/)
109:               tokens << ['"', :delimiter]
110:               tokens << [:close, :string]
111:               state = :initial
112:               next
113:             else
114:               raise_inspect "else case \" reached; %p not handled." % peek(1),
115:                 tokens, state
116:             end
117:             
118:           else
119:             raise "else case reached"
120:           end
121:           
122:           match ||= matched
123:           if $DEBUG and not kind
124:             raise_inspect 'Error token %p in line %d' %
125:             [[match, kind], line], tokens
126:           end
127:           raise_inspect 'Empty token', tokens, state unless match
128:           
129:           tokens << [match, kind]
130:           
131:         end  # until eos
132:         
133:         if state == :string
134:           tokens << [:close, :string]
135:         end
136:         
137:         tokens
138:         
139:       end

[Validate]