Mercurial > hg > soundsoftware-site
comparison vendor/gems/coderay-1.0.0/lib/coderay/scanners/ruby/patterns.rb @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
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 |