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