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