1 | <?php |
---|
2 | /* |
---|
3 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
---|
4 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
---|
5 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
---|
6 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
---|
7 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
---|
8 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
---|
9 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
---|
10 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
---|
11 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
---|
12 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
---|
13 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
14 | * |
---|
15 | * This software consists of voluntary contributions made by many individuals |
---|
16 | * and is licensed under the LGPL. For more information, see |
---|
17 | * <http://www.doctrine-project.org>. |
---|
18 | */ |
---|
19 | |
---|
20 | namespace Doctrine\Common\Annotations; |
---|
21 | |
---|
22 | use Doctrine\Common\Lexer; |
---|
23 | |
---|
24 | /** |
---|
25 | * Simple lexer for docblock annotations. |
---|
26 | * |
---|
27 | * @author Benjamin Eberlei <kontakt@beberlei.de> |
---|
28 | * @author Guilherme Blanco <guilhermeblanco@hotmail.com> |
---|
29 | * @author Jonathan Wage <jonwage@gmail.com> |
---|
30 | * @author Roman Borschel <roman@code-factory.org> |
---|
31 | * @author Johannes M. Schmitt <schmittjoh@gmail.com> |
---|
32 | */ |
---|
33 | final class DocLexer extends Lexer |
---|
34 | { |
---|
35 | const T_NONE = 1; |
---|
36 | const T_IDENTIFIER = 2; |
---|
37 | const T_INTEGER = 3; |
---|
38 | const T_STRING = 4; |
---|
39 | const T_FLOAT = 5; |
---|
40 | |
---|
41 | const T_AT = 101; |
---|
42 | const T_CLOSE_CURLY_BRACES = 102; |
---|
43 | const T_CLOSE_PARENTHESIS = 103; |
---|
44 | const T_COMMA = 104; |
---|
45 | const T_EQUALS = 105; |
---|
46 | const T_FALSE = 106; |
---|
47 | const T_NAMESPACE_SEPARATOR = 107; |
---|
48 | const T_OPEN_CURLY_BRACES = 108; |
---|
49 | const T_OPEN_PARENTHESIS = 109; |
---|
50 | const T_TRUE = 110; |
---|
51 | const T_NULL = 111; |
---|
52 | const T_COLON = 112; |
---|
53 | |
---|
54 | /** |
---|
55 | * @inheritdoc |
---|
56 | */ |
---|
57 | protected function getCatchablePatterns() |
---|
58 | { |
---|
59 | return array( |
---|
60 | '[a-z_][a-z0-9_:]*', |
---|
61 | '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', |
---|
62 | '"(?:[^"]|"")*"', |
---|
63 | ); |
---|
64 | } |
---|
65 | |
---|
66 | /** |
---|
67 | * @inheritdoc |
---|
68 | */ |
---|
69 | protected function getNonCatchablePatterns() |
---|
70 | { |
---|
71 | return array('\s+', '\*+', '(.)'); |
---|
72 | } |
---|
73 | |
---|
74 | /** |
---|
75 | * @inheritdoc |
---|
76 | */ |
---|
77 | protected function getType(&$value) |
---|
78 | { |
---|
79 | $type = self::T_NONE; |
---|
80 | |
---|
81 | // Checking numeric value |
---|
82 | if (is_numeric($value)) { |
---|
83 | return (strpos($value, '.') !== false || stripos($value, 'e') !== false) |
---|
84 | ? self::T_FLOAT : self::T_INTEGER; |
---|
85 | } |
---|
86 | |
---|
87 | if ($value[0] === '"') { |
---|
88 | $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); |
---|
89 | |
---|
90 | return self::T_STRING; |
---|
91 | } else { |
---|
92 | switch (strtolower($value)) { |
---|
93 | case '@': |
---|
94 | return self::T_AT; |
---|
95 | |
---|
96 | case ',': |
---|
97 | return self::T_COMMA; |
---|
98 | |
---|
99 | case '(': |
---|
100 | return self::T_OPEN_PARENTHESIS; |
---|
101 | |
---|
102 | case ')': |
---|
103 | return self::T_CLOSE_PARENTHESIS; |
---|
104 | |
---|
105 | case '{': |
---|
106 | return self::T_OPEN_CURLY_BRACES; |
---|
107 | |
---|
108 | case '}': |
---|
109 | return self::T_CLOSE_CURLY_BRACES; |
---|
110 | |
---|
111 | case '=': |
---|
112 | return self::T_EQUALS; |
---|
113 | |
---|
114 | case '\\': |
---|
115 | return self::T_NAMESPACE_SEPARATOR; |
---|
116 | |
---|
117 | case 'true': |
---|
118 | return self::T_TRUE; |
---|
119 | |
---|
120 | case 'false': |
---|
121 | return self::T_FALSE; |
---|
122 | |
---|
123 | case 'null': |
---|
124 | return self::T_NULL; |
---|
125 | |
---|
126 | case ':': |
---|
127 | return self::T_COLON; |
---|
128 | |
---|
129 | default: |
---|
130 | if (ctype_alpha($value[0]) || $value[0] === '_') { |
---|
131 | return self::T_IDENTIFIER; |
---|
132 | } |
---|
133 | |
---|
134 | break; |
---|
135 | } |
---|
136 | } |
---|
137 | |
---|
138 | return $type; |
---|
139 | } |
---|
140 | } |
---|