classLexicalGrammar
final class LexicalGrammar
implements LexicalGrammar
MySQL lexical generation using source-based candidate and boundary definitions. Tokenization is exposed separately for diagnostics and does not decide generation success.
Methods§
public function __construct(
private Generator $faker,
private string $profileVersion,
KeywordIndex|null $index = null,
)Parameters
$faker | Generator | Source of the choices realization makes |
$profileVersion | string | Exact server version to generate for, e.g. "mysql-8.4.7" |
$index | KeywordIndex|null | Inverts the profile's terminal-to-spelling maps |
Throws
RuntimeException When the exact release has no declarationCalls 6
- method-call DefinitionFactory::create() line 61
- new DefinitionFactory line 61
- new KeywordIndex line 62
- new LiteralGenerator line 63
- new MySqlTokenizer line 66
- function-call
in_arrayline 69
public function version(): stringNames the server version this grammar generates for.
Returns
string Profile version, e.g. "mysql-8.4.7"Test cases 1
public function isNonOutput(string $terminal): boolReports parser markers that intentionally write no characters.
Parameters
$terminal | string |
Returns
boolTest cases 2
Calls 1
- function-call
in_arrayline 90
public function realize(list<string> $terminals, GenerationPlan<bool>|null $plan = null): stringRealizes a terminal sequence using the same candidate and spacing pipeline as grammar generation.
Parameters
$terminals | list<string> | |
$plan | GenerationPlan<bool>|null |
Returns
stringThrows
LexicalException When a requested realization is unavailableTest cases 7
LexicalExceptionTest::testRealizingAnUnknownTerminalReportsTheTerminalcallsLexicalGrammarTest::testRealizeKeepsContextualUserVariableSpellingWithoutTokenizerEqualityAsAGatecallsLexicalGrammarTest::testRealizeOfFixedTerminalcallsLexicalGrammarTest::testRealizeOfGeneratedTerminalscallsLexicalGrammarTest::testRealizeReportsAnUnimplementedTerminalAtItsActualUsecallsLexicalGrammarTest::testRealizesAndChecksAParserTokenSequencecallsLexicalGrammarTest::testVersionProfileControlsDollarQuotedStringSupportcalls
Calls 2
- method-call LexicalGrammar::realizeSequence() line 102
- static-call TerminalSequence::fromNames() line 102
public function realizeSequence(
TerminalSequence $sequence,
GenerationPlan<bool>|null $plan = null,
): stringResolves candidates and boundaries from right to left, then concatenates the chosen output.
Parameters
$sequence | TerminalSequence | |
$plan | GenerationPlan<bool>|null |
Returns
stringThrows
LexicalException When a terminal has no applicable realizationTest cases 3
Called from 1
Calls 4
- method-call LexicalGrammar::resolveSequence() line 112
- method-call
Generator::numberBetween()line 112 - method-call SqlSerializer::serialize() line 113
- new SqlSerializer line 113
public function resolveSequence(
TerminalSequence $sequence,
GenerationPlan<bool>|null $plan,
Closure(int): int $choose,
Closure(positive-int): ?int|null $valueChoice = null,
): ResolvedOutputExposes the resolved choices to a plan compiler without interpreting its input.
Parameters
$sequence | TerminalSequence | |
$plan | GenerationPlan<bool>|null | |
$choose | Closure(int): int | |
$valueChoice | Closure(positive-int): ?int|null | Constructive values selected only while compiling a plan |
Returns
Throws
LexicalException When no compatible candidate existsCalled from 1
Calls 1
- method-call ReverseLexemeGenerator::generate() line 126
public function tokenize(string $sql): list<string>Reads SQL text into the tokens MySQL's own lexer would produce.
Parameters
$sql | string | Text to read |
Returns
list<string> Parser token names, in orderThrows
LexicalException When the text holds something the lexer cannot readTest cases 25
LexicalExceptionTest::testTokenizingUnsupportedInputReportsTheOffsetAndTheInputcallsLexicalGrammarTest::testCombinesWithRollupAtTheEndOfInputcallsLexicalGrammarTest::testGeneratesPublicProviderLexemesThroughDialectGrammarcallsLexicalGrammarTest::testRealizeOfGeneratedTerminalscallsLexicalGrammarTest::testRealizesAndChecksAParserTokenSequencecallsLexicalGrammarTest::testRejectsInvalidSqlcallsLexicalGrammarTest::testTokenizesDollarQuotedStringAndContinuesWithTheRemainingInputcallsLexicalGrammarTest::testTokenizesEveryLiteralNumberAndOperatorClasscallsLexicalGrammarTest::testTokenizesHostnameWithoutStoppingTheRemainingInputcallsLexicalGrammarTest::testTokenizesQuotedValuesHexValuesAndCommentsAsSingleTokenscallsLexicalGrammarTest::testUsesFunctionTokensOnlyWhenFollowedByAnOpeningParenthesiscallsMySqlProviderTest::testForeignKeyCascadeStatementcallsMySqlProviderTest::testForeignKeyConstraintcallsMySqlProviderTest::testFullTextSearchStatementDerivesMatchExpressionFromGrammarcallsMySqlProviderTest::testGeneratedColumnStatementcallsMySqlProviderTest::testInsertFunctionUpsertStatementDerivesConditionalExpressionFromGrammarcallsMySqlProviderTest::testInsertRowAliasUpsertStatementcallsMySqlProviderTest::testInsertSelectCompoundStatementcallsMySqlProviderTest::testMultiTableDeleteStatementcallsMySqlProviderTest::testMultiTableUpdateStatementcallsMySqlProviderTest::testOrderClausecallsMySqlProviderTest::testPartitionSelectStatementcallsMySqlProviderTest::testTemporaryTableStatementcallsMySqlProviderTest::testUpdateJoinDerivedStatementcallsMySqlProviderTest::testViewStatementcalls
Calls 1
- method-call MySqlTokenizer::tokenize() line 140
public function generateQuotedIdentifier(
int $minLength = 1,
int $maxLength = 64,
): non-empty-stringWrites a backtick-quoted identifier of a bounded length.
Parameters
$minLength | int | Shortest identifier body to write |
$maxLength | int | Longest identifier body to write |
Returns
non-empty-string A quoted identifierTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::rawIdentifier() line 153
public function generateStringLiteral(
int $minLength = 1,
int $maxLength = 255,
): non-empty-stringWrites a single-quoted string literal of a bounded length.
Parameters
$minLength | int | Shortest body to write |
$maxLength | int | Longest body to write |
Returns
non-empty-string A string literalTest cases 3
Called from 2
Calls 1
- method-call LiteralGenerator::mixedAlnumString() line 166
public function generateNationalStringLiteral(
int $minLength = 1,
int $maxLength = 255,
): non-empty-stringWrites a national character string literal.
Parameters
$minLength | int | Shortest body to write |
$maxLength | int | Longest body to write |
Returns
non-empty-string An N-prefixed string literalTest cases 3
Called from 1
Calls 1
- method-call LexicalGrammar::generateStringLiteral() line 179
public function generateDollarQuotedString(
int $minLength = 1,
int $maxLength = 255,
): non-empty-stringWrites a dollar-quoted string literal.
Parameters
$minLength | int | Shortest body to write |
$maxLength | int | Longest body to write |
Returns
non-empty-string A dollar-quoted stringTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::mixedAlnumString() line 192
public function generateIntegerLiteral(int $min = 1, int $max = 2147483647): non-empty-stringWrites an integer literal inside the range MySQL reads as NUM.
Parameters
$min | int | Smallest value to write |
$max | int | Largest value to write |
Returns
non-empty-string An integer literalTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::integerString() line 205
public function generateLongIntegerLiteral(
int $min = 0,
int $max = 2147483647,
): non-empty-stringWrites an integer literal wide enough for MySQL to read as LONG_NUM.
Parameters
$min | int | Smallest value to write |
$max | int | Largest value to write |
Returns
non-empty-string An integer literalTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::longIntString() line 218
public function generateUnsignedBigIntLiteral(
int $minLength = 1,
int $maxLength = 20,
): non-empty-stringWrites an integer literal wide enough for MySQL to read as ULONGLONG_NUM.
Parameters
$minLength | int | Fewest digits to write |
$maxLength | int | Most digits to write |
Returns
non-empty-string An integer literalTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::unsignedBigIntString() line 231
public function generateDecimalLiteral(int $precision = 10, int $scale = 2): non-empty-stringWrites a fixed-point literal.
Parameters
$precision | int | Total digits to write |
$scale | int | Digits after the point |
Returns
non-empty-string A decimal literalTest cases 3
Called from 2
Calls 1
- method-call LiteralGenerator::decimalString() line 244
public function generateFloatLiteral(
int $precision = 10,
int $scale = 2,
int $minExponent = -38,
int $maxExponent = 38,
): non-empty-stringWrites a floating-point literal in exponent form.
Parameters
$precision | int | Total digits of the mantissa |
$scale | int | Digits after the point in the mantissa |
$minExponent | int | Smallest exponent to write |
$maxExponent | int | Largest exponent to write |
Returns
non-empty-string A float literalTest cases 3
Called from 1
Calls 2
- method-call LiteralGenerator::floatString() line 263
- method-call LexicalGrammar::generateDecimalLiteral() line 264
public function generateHexLiteral(int $minLength = 1, int $maxLength = 16): non-empty-stringWrites a hexadecimal literal in 0x form.
Parameters
$minLength | int | Fewest hex digits to write |
$maxLength | int | Most hex digits to write |
Returns
non-empty-string A hexadecimal literalTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::hexString() line 280
public function generateQuotedHexLiteral(int $minBytes = 1, int $maxBytes = 8): non-empty-stringWrites a hexadecimal literal in X'..' form, which takes whole bytes.
Parameters
$minBytes | int | Fewest bytes to write |
$maxBytes | int | Most bytes to write |
Returns
non-empty-string A quoted hexadecimal literalTest cases 3
Called from 1
Calls 2
- method-call
Generator::numberBetween()line 293 - method-call LiteralGenerator::hexString() line 295
public function generateBinaryLiteral(int $minLength = 1, int $maxLength = 64): non-empty-stringWrites a binary literal in 0b form.
Parameters
$minLength | int | Fewest bits to write |
$maxLength | int | Most bits to write |
Returns
non-empty-string A binary literalTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::binaryString() line 308
public function generateHostname(
int $minParts = 1,
int $maxParts = 4,
int $maxPartLength = 63,
): non-empty-stringWrites a hostname, as it appears after the @ of a user specification.
Parameters
$minParts | int | Fewest dot-separated parts to write |
$maxParts | int | Most dot-separated parts to write |
$maxPartLength | int | Longest single part to write |
Returns
non-empty-string A hostnameTest cases 3
Called from 1
Calls 1
- method-call LiteralGenerator::hostnameString() line 322
public function generate(GenerationPlan<bool> $plan): non-empty-stringWrites the one lexeme a lexical generation plan asks for.
Parameters
$plan | GenerationPlan<bool> | Plan naming the lexeme kind and its bounds |
Returns
non-empty-string The lexemeThrows
InvalidArgumentException When the plan names a lexeme kind this dialect has none ofCalls 16
- method-call GenerationPlan::lexicalTarget() line 337
- method-call GenerationPlan::parameters() line 338
- method-call LexicalGrammar::generateQuotedIdentifier() line 341
- method-call LexicalGrammar::generateStringLiteral() line 342
- method-call LexicalGrammar::generateNationalStringLiteral() line 343
- method-call LexicalGrammar::generateDollarQuotedString() line 347
- method-call LexicalGrammar::generateIntegerLiteral() line 351
- method-call LexicalGrammar::generateLongIntegerLiteral() line 352
- method-call LexicalGrammar::generateUnsignedBigIntLiteral() line 353
- method-call LexicalGrammar::generateDecimalLiteral() line 357
- method-call LexicalGrammar::generateFloatLiteral() line 358
- method-call LexicalGrammar::generateHexLiteral() line 364
- method-call LexicalGrammar::generateQuotedHexLiteral() line 365
- method-call LexicalGrammar::generateBinaryLiteral() line 366
- method-call LexicalGrammar::generateHostname() line 367
- new
InvalidArgumentExceptionline 372
Private surface 6§
Implementation details, listed for orientation only.
private LiteralGenerator $stringsprivate ReverseLexemeGenerator $pipelineprivate list<string> $nonOutputprivate MySqlTokenizer $tokenizerprivate Generator $fakerprivate string $profileVersionTest cases 56§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 36
LexicalGrammarTest::providerDialectLexicalGrammarcallsLexicalGrammarTest::testIsNonOutputDistinguishesParserSelectorsFromKeywordscallsLexicalGrammarTest::testRealizeSequenceHonorsAnExplicitLexemePlancallsLexicalGrammarTest::providerPublicLexemeDefaultscallsLexicalGrammarTest::testCombinesWithRollupAtTheEndOfInputcallsLexicalGrammarTest::testGenerateBinaryLiteralWritesBitsAfterAPrefixcallsLexicalGrammarTest::testGenerateDecimalLiteralWritesDigitsAroundAPointcallsLexicalGrammarTest::testGenerateDollarQuotedStringWrapsTheBodyInDoubleDollarscallsLexicalGrammarTest::testGenerateFloatLiteralWritesAnExponentcallsLexicalGrammarTest::testGenerateHexLiteralWritesHexDigitsAfterAPrefixcallsLexicalGrammarTest::testGenerateHostnameWritesDotSeparatedPartscallsLexicalGrammarTest::testGenerateIntegerLiteralWritesOnlyDigitscallsLexicalGrammarTest::testGenerateLongIntegerLiteralWritesOnlyDigitscallsLexicalGrammarTest::testGenerateNationalStringLiteralPrefixesTheStringWithNcallsLexicalGrammarTest::testGenerateQuotedHexLiteralWritesWholeBytesInQuotescallsLexicalGrammarTest::testGenerateQuotedIdentifierWrapsTheNameInBacktickscallsLexicalGrammarTest::testGeneratesPublicProviderLexemesThroughDialectGrammarcallsLexicalGrammarTest::testGenerateStringLiteralWrapsTheBodyInSingleQuotescallsLexicalGrammarTest::testGenerateUnsignedBigIntLiteralWritesOnlyDigitscallsLexicalGrammarTest::testIsNonOutputDoesNotConfuseOrdinaryValuesWithParserMarkerscallsLexicalGrammarTest::testPublicLexemeDefaultBoundscallsLexicalGrammarTest::testRealizeKeepsContextualUserVariableSpellingWithoutTokenizerEqualityAsAGatecallsLexicalGrammarTest::testRealizeOfFixedTerminalcallsLexicalGrammarTest::testRealizeOfGeneratedTerminalscallsLexicalGrammarTest::testRealizeReportsAnUnimplementedTerminalAtItsActualUsecallsLexicalGrammarTest::testRealizeRetainsBothRegisteredInequalitySpellingscallsLexicalGrammarTest::testRealizesAndChecksAParserTokenSequencecallsLexicalGrammarTest::testRealizeSequenceHonorsThePlannedStringWithoutRequiringTriviacallsLexicalGrammarTest::testRejectsInvalidSqlcallsLexicalGrammarTest::testResolveSequenceExposesTheChosenCandidateAndItsOutputcallsLexicalGrammarTest::testTokenizesDollarQuotedStringAndContinuesWithTheRemainingInputcallsLexicalGrammarTest::testTokenizesEveryLiteralNumberAndOperatorClasscallsLexicalGrammarTest::testTokenizesHostnameWithoutStoppingTheRemainingInputcallsLexicalGrammarTest::testTokenizesQuotedValuesHexValuesAndCommentsAsSingleTokenscallsLexicalGrammarTest::testUsesFunctionTokensOnlyWhenFollowedByAnOpeningParenthesiscallsLexicalGrammarTest::testVersionProfileControlsDollarQuotedStringSupportcalls
Other tests reaching this symbol 20
LexicalExceptionTest::testRealizingAnUnknownTerminalReportsTheTerminalcallsLexicalExceptionTest::testTokenizingUnsupportedInputReportsTheOffsetAndTheInputcallsGenerationContextTestcallsSqlGeneratorFactoryTestcallsMySqlProviderTest::testForeignKeyCascadeStatementcallsMySqlProviderTest::testForeignKeyConstraintcallsMySqlProviderTest::testFullTextSearchStatementDerivesMatchExpressionFromGrammarcallsMySqlProviderTest::testGeneratedColumnStatementcallsMySqlProviderTest::testInsertFunctionUpsertStatementDerivesConditionalExpressionFromGrammarcallsMySqlProviderTest::testInsertRowAliasUpsertStatementcallsMySqlProviderTest::testInsertSelectCompoundStatementcallsMySqlProviderTest::testMultiTableDeleteStatementcallsMySqlProviderTest::testMultiTableUpdateStatementcallsMySqlProviderTest::testOrderClausecallsMySqlProviderTest::testPartitionSelectStatementcallsMySqlProviderTest::testTemporaryTableStatementcallsMySqlProviderTest::testUpdateJoinDerivedStatementcallsMySqlProviderTest::testViewStatementcallsPostgreSqlProviderTestcallsSqliteProviderTestcalls