| Class | CodeRay::Scanners::Clojure |
| In: |
lib/coderay/scanners/clojure.rb
|
| Parent: | Scanner |
Clojure scanner by Licenser.
| IDENT_KIND | = | WordList.new(:ident). add(SPECIAL_FORMS, :keyword). add(CORE_FORMS, :keyword). add(PREDEFINED_CONSTANTS, :predefined_constant) |
| KEYWORD_NEXT_TOKEN_KIND | = | WordList.new(nil). add(%w[ def defn defn- definline defmacro defmulti defmethod defstruct defonce declare ], :function). add(%w[ ns ], :namespace). add(%w[ defprotocol defrecord ], :class) |
| BASIC_IDENTIFIER | = | /[a-zA-Z$%*\/_+!?&<>\-=]=?[a-zA-Z0-9$&*+!\/_?<>\-\#]*/ |
| IDENTIFIER | = | /(?!-\d)(?:(?:#{BASIC_IDENTIFIER}\.)*#{BASIC_IDENTIFIER}(?:\/#{BASIC_IDENTIFIER})?\.?)|\.\.?/ |
| SYMBOL | = | /::?#{IDENTIFIER}/o |
| 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/clojure.rb, line 145
145: def scan_tokens encoder, options
146:
147: state = :initial
148: kind = nil
149:
150: until eos?
151:
152: case state
153: when :initial
154: if match = scan(/ \s+ | \\\n | , /x)
155: encoder.text_token match, :space
156: elsif match = scan(/['`\(\[\)\]\{\}]|\#[({]|~@?|[@\^]/)
157: encoder.text_token match, :operator
158: elsif match = scan(/;.*/)
159: encoder.text_token match, :comment # TODO: recognize (comment ...) too
160: elsif match = scan(/\#?\\(?:newline|space|.?)/)
161: encoder.text_token match, :char
162: elsif match = scan(/\#[ft]/)
163: encoder.text_token match, :predefined_constant
164: elsif match = scan(/#{IDENTIFIER}/o)
165: kind = IDENT_KIND[match]
166: encoder.text_token match, kind
167: if rest? && kind == :keyword
168: if kind = KEYWORD_NEXT_TOKEN_KIND[match]
169: encoder.text_token match, :space if match = scan(/\s+/o)
170: encoder.text_token match, kind if match = scan(/#{IDENTIFIER}/o)
171: end
172: end
173: elsif match = scan(/#{SYMBOL}/o)
174: encoder.text_token match, :symbol
175: elsif match = scan(/\./)
176: encoder.text_token match, :operator
177: elsif match = scan(/ \# \^ #{IDENTIFIER} /ox)
178: encoder.text_token match, :type
179: elsif match = scan(/ (\#)? " /x)
180: state = self[1] ? :regexp : :string
181: encoder.begin_group state
182: encoder.text_token match, :delimiter
183: elsif match = scan(/#{NUM}/o) and not matched.empty?
184: encoder.text_token match, match[/[.e\/]/i] ? :float : :integer
185: else
186: encoder.text_token getch, :error
187: end
188:
189: when :string, :regexp
190: if match = scan(/[^"\\]+|\\.?/)
191: encoder.text_token match, :content
192: elsif match = scan(/"/)
193: encoder.text_token match, :delimiter
194: encoder.end_group state
195: state = :initial
196: else
197: raise_inspect "else case \" reached; %p not handled." % peek(1),
198: encoder, state
199: end
200:
201: else
202: raise 'else case reached'
203:
204: end
205:
206: end
207:
208: if [:string, :regexp].include? state
209: encoder.end_group state
210: end
211:
212: encoder
213:
214: end