classBisonScannerChain
final class BisonScannerChain
Restricted visibility: declared "@visibility root". Code outside that scope must not name this declaration.
Chooses which scanner owns the character under the cursor.
Holding the order in one place is what makes the lexer's dispatch a lookup rather than a decision: no scanner needs to know which others exist, and the grammar language can gain a lexeme by adding a scanner to the chain.
Methods§
public function __construct(private list<BisonScanner> $scanners)Parameters
$scanners | list<BisonScanner> | Scanners in the order they are consulted |
Test cases 12
BisonScannerChainTest::testForBisonGrammarCoversEveryLexemeOfTheGrammarLanguagecoversBisonScannerChainTest::testScannerForFindsNothingInAnEmptyChaincoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#actioncoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#character literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#directivecoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#identifiercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#numbercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#punctuationcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#string literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#type tagcoversBisonScannerChainTest::testScannerForReportsNothingForAnUnclaimedCharactercoversBisonScannerChainTest::testScannerForReturnsTheFirstScannerThatClaimsTheCharactercovers
public static function forBisonGrammar(): selfBuilds the chain that reads GNU Bison and Yacc grammar files.
The claimed characters do not overlap, so the order is documentation rather than precedence.
Returns
self A chain covering every lexeme of the grammar languageTest cases 11
BisonScannerChainTest::testForBisonGrammarCoversEveryLexemeOfTheGrammarLanguagecovers and callsBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharactercallsBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#actioncoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#character literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#directivecoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#identifiercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#numbercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#punctuationcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#string literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#type tagcoversBisonScannerChainTest::testScannerForReportsNothingForAnUnclaimedCharactercovers and calls
Called from 1
Calls 8
- new
selfline 35 - new DirectiveScanner line 36
- new ActionScanner line 37
- new TypeTagScanner line 38
- new QuotedLiteralScanner line 39
- new NumberScanner line 40
- new IdentifierScanner line 41
- new PunctuationScanner line 42
public function scannerFor(string $character): BisonScanner|nullFinds the scanner that recognises a lexeme starting at the character.
Parameters
$character | string | A single character; never the empty string |
Returns
BisonScanner|null The first scanner that claims it, or null when none doesTest cases 12
BisonScannerChainTest::testForBisonGrammarCoversEveryLexemeOfTheGrammarLanguagecoversBisonScannerChainTest::testScannerForFindsNothingInAnEmptyChaincovers and callsBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#actioncoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#character literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#directivecoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#identifiercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#numbercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#punctuationcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#string literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#type tagcoversBisonScannerChainTest::testScannerForReportsNothingForAnUnclaimedCharactercoversBisonScannerChainTest::testScannerForReturnsTheFirstScannerThatClaimsTheCharactercovers and calls
Private surface 1§
Implementation details, listed for orientation only.
private list<BisonScanner> $scannersTest cases 29§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 13
BisonScannerChainTest::testForBisonGrammarCoversEveryLexemeOfTheGrammarLanguagecovers and callsBisonScannerChainTest::testScannerForFindsNothingInAnEmptyChaincovers and callsBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharactercallsBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#actioncoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#character literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#directivecoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#identifiercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#numbercoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#punctuationcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#string literalcoversBisonScannerChainTest::testScannerForReachesTheScannerThatOwnsEachOpeningCharacter#type tagcoversBisonScannerChainTest::testScannerForReportsNothingForAnUnclaimedCharactercovers and callsBisonScannerChainTest::testScannerForReturnsTheFirstScannerThatClaimsTheCharactercovers and calls
Other tests reaching this symbol 16
BisonParserTestcallsBisonPreambleReaderTestcallsBisonDirectiveReaderChainTestcallsDefineDirectiveReaderTestcallsExpectDirectiveReaderTestcallsParamDirectiveReaderTestcallsPrecedenceDirectiveReaderTestcallsStartDirectiveReaderTestcallsTokenDirectiveReaderTestcallsTypeDirectiveReaderTestcallsUnknownDirectiveReaderTestcallsBisonLexerTest::testScanRejectsWhatTheGivenChainDoesNotCovercallsBisonLexerTest::testScanUsesTheChainItWasGivencallsBisonTokenStreamTestcallsBisonAlternativeReaderTestcallsBisonRuleReaderTestcalls