To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / e1 / e1ade5140c036735af4b0ad735c4d03a68cc6596.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (4.7 KB)

1
# encoding: utf-8
2
module CodeRay
3
module Scanners
4

    
5
  module Ruby::Patterns  # :nodoc: all
6

    
7
    KEYWORDS = %w[
8
      and def end in or unless begin
9
      defined? ensure module redo super until
10
      BEGIN break do next rescue then
11
      when END case else for retry
12
      while alias class elsif if not return
13
      undef yield
14
    ]
15

    
16
    # See http://murfy.de/ruby-constants.
17
    PREDEFINED_CONSTANTS = %w[
18
      nil true false self
19
      DATA ARGV ARGF ENV
20
      FALSE TRUE NIL
21
      STDERR STDIN STDOUT
22
      TOPLEVEL_BINDING
23
      RUBY_COPYRIGHT RUBY_DESCRIPTION RUBY_ENGINE RUBY_PATCHLEVEL
24
      RUBY_PLATFORM RUBY_RELEASE_DATE RUBY_REVISION RUBY_VERSION
25
      __FILE__ __LINE__ __ENCODING__
26
    ]
27

    
28
    IDENT_KIND = WordList.new(:ident).
29
      add(KEYWORDS, :keyword).
30
      add(PREDEFINED_CONSTANTS, :predefined_constant)
31

    
32
    KEYWORD_NEW_STATE = WordList.new(:initial).
33
      add(%w[ def ], :def_expected).
34
      add(%w[ undef ], :undef_expected).
35
      add(%w[ alias ], :alias_expected).
36
      add(%w[ class module ], :module_expected)
37

    
38
    IDENT = 'ä'[/[[:alpha:]]/] == 'ä' ? /[[:alpha:]_][[:alnum:]_]*/ : /[^\W\d]\w*/
39

    
40
    METHOD_NAME = / #{IDENT} [?!]? /ox
41
    METHOD_NAME_OPERATOR = /
42
      \*\*?           # multiplication and power
43
      | [-+~]@?       # plus, minus, tilde with and without at sign
44
      | [\/%&|^`]     # division, modulo or format strings, and, or, xor, system
45
      | \[\]=?        # array getter and setter
46
      | << | >>       # append or shift left, shift right
47
      | <=?>? | >=?   # comparison, rocket operator
48
      | ===? | =~     # simple equality, case equality, match
49
      | ![~=@]?       # negation with and without at sign, not-equal and not-match
50
    /ox
51
    METHOD_SUFFIX = / (?: [?!] | = (?![~>]|=(?!>)) ) /x
52
    METHOD_NAME_EX = / #{IDENT} #{METHOD_SUFFIX}? | #{METHOD_NAME_OPERATOR} /ox
53
    METHOD_AFTER_DOT = / #{IDENT} [?!]? | #{METHOD_NAME_OPERATOR} /ox
54
    INSTANCE_VARIABLE = / @ #{IDENT} /ox
55
    CLASS_VARIABLE = / @@ #{IDENT} /ox
56
    OBJECT_VARIABLE = / @@? #{IDENT} /ox
57
    GLOBAL_VARIABLE = / \$ (?: #{IDENT} | [1-9]\d* | 0\w* | [~&+`'=\/,;_.<>!@$?*":\\] | -[a-zA-Z_0-9] ) /ox
58
    PREFIX_VARIABLE = / #{GLOBAL_VARIABLE} | #{OBJECT_VARIABLE} /ox
59
    VARIABLE = / @?@? #{IDENT} | #{GLOBAL_VARIABLE} /ox
60

    
61
    QUOTE_TO_TYPE = {
62
      '`' => :shell,
63
      '/'=> :regexp,
64
    }
65
    QUOTE_TO_TYPE.default = :string
66

    
67
    REGEXP_MODIFIERS = /[mousenix]*/
68

    
69
    DECIMAL = /\d+(?:_\d+)*/
70
    OCTAL = /0_?[0-7]+(?:_[0-7]+)*/
71
    HEXADECIMAL = /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/
72
    BINARY = /0b[01]+(?:_[01]+)*/
73

    
74
    EXPONENT = / [eE] [+-]? #{DECIMAL} /ox
75
    FLOAT_SUFFIX = / #{EXPONENT} | \. #{DECIMAL} #{EXPONENT}? /ox
76
    FLOAT_OR_INT = / #{DECIMAL} (?: #{FLOAT_SUFFIX} () )? /ox
77
    NUMERIC = / (?: (?=0) (?: #{OCTAL} | #{HEXADECIMAL} | #{BINARY} ) | #{FLOAT_OR_INT} ) /ox
78

    
79
    SYMBOL = /
80
      :
81
      (?:
82
        #{METHOD_NAME_EX}
83
      | #{PREFIX_VARIABLE}
84
      | ['"]
85
      )
86
    /ox
87
    METHOD_NAME_OR_SYMBOL = / #{METHOD_NAME_EX} | #{SYMBOL} /ox
88

    
89
    SIMPLE_ESCAPE = /
90
        [abefnrstv]
91
      |  [0-7]{1,3}
92
      | x[0-9A-Fa-f]{1,2}
93
      | .
94
    /mx
95
    
96
    CONTROL_META_ESCAPE = /
97
      (?: M-|C-|c )
98
      (?: \\ (?: M-|C-|c ) )*
99
      (?: [^\\] | \\ #{SIMPLE_ESCAPE} )?
100
    /mox
101
    
102
    ESCAPE = /
103
      #{CONTROL_META_ESCAPE} | #{SIMPLE_ESCAPE}
104
    /mox
105
    
106
    CHARACTER = /
107
      \?
108
      (?:
109
        [^\s\\]
110
      | \\ #{ESCAPE}
111
      )
112
    /mox
113

    
114
    # NOTE: This is not completely correct, but
115
    # nobody needs heredoc delimiters ending with \n.
116
    HEREDOC_OPEN = /
117
      << (-)?              # $1 = float
118
      (?:
119
        ( [A-Za-z_0-9]+ )  # $2 = delim
120
      |
121
        ( ["'`\/] )        # $3 = quote, type
122
        ( [^\n]*? ) \3     # $4 = delim
123
      )
124
    /mx
125

    
126
    RUBYDOC = /
127
      =begin (?!\S)
128
      .*?
129
      (?: \Z | ^=end (?!\S) [^\n]* )
130
    /mx
131

    
132
    DATA = /
133
      __END__$
134
      .*?
135
      (?: \Z | (?=^\#CODE) )
136
    /mx
137
    
138
    RUBYDOC_OR_DATA = / #{RUBYDOC} | #{DATA} /xo
139

    
140
    # Checks for a valid value to follow. This enables
141
    # value_expected in method calls without parentheses.
142
    VALUE_FOLLOWS = /
143
      (?>[ \t\f\v]+)
144
      (?:
145
        [%\/][^\s=]
146
      | <<-?\S
147
      | [-+] \d
148
      | #{CHARACTER}
149
      )
150
    /ox
151
    KEYWORDS_EXPECTING_VALUE = WordList.new.add(%w[
152
      and end in or unless begin
153
      defined? ensure redo super until
154
      break do next rescue then
155
      when case else for retry
156
      while elsif if not return
157
      yield
158
    ])
159
    
160
    FANCY_STRING_START = / % ( [QqrsWwx] | (?![a-zA-Z0-9]) ) ([^a-zA-Z0-9]) /x
161
    FANCY_STRING_KIND = Hash.new(:string).merge({
162
      'r' => :regexp,
163
      's' => :symbol,
164
      'x' => :shell,
165
    })
166
    FANCY_STRING_INTERPRETED = Hash.new(true).merge({
167
      'q' => false,
168
      's' => false,
169
      'w' => false,
170
    })
171
    
172
  end
173
  
174
end
175
end