/** * @param TokenTypes $tokens * @throws \RuntimeException * @return array|TokenMatchReader[] */ public static function regexPatterns(TokenTypes $tokens = null) { if (is_null($tokens)) { $tokens = new TokenTypes(); } $requiredTokens = array(TokenTypes::ENUM_CONCATENATE, TokenTypes::ENUM_DEFINITION_LIST_START, TokenTypes::ENUM_DEFINITION_SEPARATOR, TokenTypes::ENUM_START_REPEAT, TokenTypes::ENUM_END_REPEAT, TokenTypes::ENUM_START_OPTION, TokenTypes::ENUM_END_OPTION, TokenTypes::ENUM_START_GROUP, TokenTypes::ENUM_END_GROUP, TokenTypes::ENUM_TERMINATOR); foreach ($requiredTokens as $requiredTokenType) { if (!$tokens->contains($requiredTokenType)) { throw new \RuntimeException('required token missing from enum'); } } $regexBuilder = new RegexBuilder(); $instance = new self($regexBuilder); //add longer patterns first $tokenPatterns = []; //longer patterns $tokenPatterns[] = $instance->buildStringLiteralPattern(TokenTypes::ENUM_STRING_LITERAL); $tokenPatterns[] = $instance->buildIdentifierPattern(TokenTypes::ENUM_IDENTIFIER); $tokenPatterns[] = $instance->buildSpecialSequencePattern(TokenTypes::ENUM_SPECIAL_SEQUENCE); $tokenPatterns[] = $instance->buildCommentPattern(TokenTypes::ENUM_COMMENT); $tokenPatterns[] = $instance->buildDefinitionListStartPattern(TokenTypes::ENUM_DEFINITION_LIST_START); //shorter patterns $tokenPatterns[] = $instance->createStringPattern(TokenTypes::ENUM_CONCATENATE, Symbols::ENUM_CONCATENATE); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_DEFINITION_SEPARATOR, Symbols::ENUM_DEFINITION_SEPARATOR); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_START_REPEAT, Symbols::ENUM_START_REPEAT); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_END_REPEAT, Symbols::ENUM_END_REPEAT); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_START_OPTION, Symbols::ENUM_START_OPTION); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_END_OPTION, Symbols::ENUM_END_OPTION); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_START_GROUP, Symbols::ENUM_START_GROUP); $tokenPatterns[] = $instance->createQuotedPattern(TokenTypes::ENUM_END_GROUP, Symbols::ENUM_END_GROUP); $tokenPatterns[] = $instance->buildTerminatorPattern(TokenTypes::ENUM_TERMINATOR); return $tokenPatterns; }