| 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