Class | CodeRay::Scanners::Scheme |
In: |
lib/coderay/scanners/scheme.rb
|
Parent: | Scanner |
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}/ |
# 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