[345] | 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 | } |
---|