classScanner
final class Scanner
Restricted visibility: declared "@visibility root". Code outside that scope must not name this declaration.
Splits a grammar file into tokens as Lemon's Parse does.
Whitespace and comments are skipped. A token is a string in double quotes, a braced code block, a word of letters, digits and underscores starting with a letter or digit, the arrow ::=, a compound token |X or /X, or any single other character.
Methods§
public function __construct(private CodeReader $code = new \LemonParser\Scanner\CodeReader())Parameters
$code | CodeReader | Reads braced code |
Calls 1
- new CodeReader line 24
public function scan(string $source): non-empty-list<Token>Scans the whole text.
Parameters
$source | string | The preprocessed grammar file |
Returns
non-empty-list<Token> The tokens, ending with an end-of-file tokenTest cases 49
ScannerTest::testScancallsDeclarationReaderTest::testArgumentcallsDeclarationReaderTest::testArgumentRejectsPunctuationcallsDeclarationReaderTest::testReadcallsDeclarationReaderTest::testReadDestructorcallsDeclarationReaderTest::testReadDestructorRejectsAMissingSymbolcallsDeclarationReaderTest::testReadRejectsAKeywordThatIsNotAWordcallsDeclarationReaderTest::testReadRejectsAnUnknownKeywordcallsDeclarationReaderTest::testReadTokenClasscallsDeclarationReaderTest::testReadTokenClassRejectsAKnownNamecallsDeclarationReaderTest::testReadTokenClassRejectsATerminalNamecallsDeclarationReaderTest::testReadTypecallsDeclarationReaderTest::testReadTypeRejectsAMissingSymbolcallsDeclarationReaderTest::testReadTypeRejectsASecondTypecallsGrammarReaderTest::testPrecedencecallsGrammarReaderTest::testPrecedenceRejectsAMissingClosercallsGrammarReaderTest::testPrecedenceRejectsAMissingRulecallsGrammarReaderTest::testPrecedenceRejectsANonterminalcallsGrammarReaderTest::testPrecedenceRejectsASecondMarkcallsGrammarReaderTest::testReadcallsGrammarReaderTest::testReadRejectsAStrayTokencallsRuleReaderTest::testAliascallsRuleReaderTest::testAliasRejectsABadNamecallsRuleReaderTest::testAliasRejectsAMissingClosercallsRuleReaderTest::testHeadcallsRuleReaderTest::testHeadRejectsABadAliascallsRuleReaderTest::testHeadRejectsAMissingArrowcallsRuleReaderTest::testHeadRejectsAMissingArrowAfterTheAliascallsRuleReaderTest::testHeadRejectsAnUnclosedAliascallsRuleReaderTest::testReadcallsRuleReaderTest::testReadAcceptsAnEmptyRightHandSidecallsRuleReaderTest::testReadRejectsACompoundAtTheStartcallsRuleReaderTest::testReadRejectsALowerCaseCompoundcallsRuleReaderTest::testReadRejectsAnIllegalCharactercallsRuleReaderTest::testReadRejectsTheEndOfTheFilecallsSymbolListReaderTest::testClassTokenscallsSymbolListReaderTest::testClassTokensRejectsANonterminalcallsSymbolListReaderTest::testFallbackscallsSymbolListReaderTest::testFallbacksRejectsANonterminalcallsSymbolListReaderTest::testFallbacksRejectsASecondFallbackForATokencallsSymbolListReaderTest::testRankedcallsSymbolListReaderTest::testRankedRejectsANonterminalcallsSymbolListReaderTest::testTokenscallsSymbolListReaderTest::testTokensRejectsANonterminalcallsSymbolListReaderTest::testUntilPeriodcallsSymbolListReaderTest::testUntilPeriodRejectsTheEndOfTheFilecallsSymbolListReaderTest::testWildcardcallsSymbolListReaderTest::testWildcardRejectsANonterminalcallsSymbolListReaderTest::testWildcardRejectsASecondTokencalls
Called from 1
Calls 7
- new Cursor line 37
- method-call Scanner::skipTrivia() line 40
- method-call Cursor::eof() line 41
- new Token line 42
- class-const TokenKind::End() line 42
- method-call Cursor::location() line 42
- method-call Scanner::next() line 46
public function skipTrivia(Cursor $cursor): voidMoves past whitespace and comments.
Parameters
$cursor | Cursor | The position |
Test cases 2
Called from 1
Calls 7
- method-call Cursor::eof() line 57
- method-call Cursor::match() line 58
- method-call Cursor::startsWith() line 61
- method-call Cursor::take() line 64
- method-call Cursor::peek() line 64
- method-call Cursor::takeUntil() line 65
- function-call
strlenline 66
Reads the token the cursor is at.
Parameters
$cursor | Cursor | Positioned at the first byte of a token |
Returns
Token The tokenThrows
SyntaxException When a string or code block is not closedTest cases 2
Called from 1
Calls 15
- method-call Cursor::location() line 82
- method-call Cursor::peek() line 83
- method-call Cursor::take() line 85
- method-call Cursor::takeUntil() line 86
- new SyntaxException line 88
- new Token line 91
- class-const TokenKind::String() line 91
- method-call CodeReader::read() line 94
- class-const TokenKind::Code() line 96
- method-call Cursor::match() line 98
- class-const TokenKind::Word() line 100
- class-const TokenKind::Arrow() line 103
- class-const TokenKind::Compound() line 107
- function-call
substrline 107 - class-const TokenKind::Punctuation() line 111
Private surface 1§
Implementation details, listed for orientation only.
private CodeReader $code = new \LemonParser\Scanner\CodeReader()Test cases 56§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 5
Other tests reaching this symbol 51
LemonGrammarCompilerTestcallsLemonGrammarReaderTestcallsParserTestcallsDeclarationReaderTest::testArgumentcallsDeclarationReaderTest::testArgumentRejectsPunctuationcallsDeclarationReaderTest::testReadcallsDeclarationReaderTest::testReadDestructorcallsDeclarationReaderTest::testReadDestructorRejectsAMissingSymbolcallsDeclarationReaderTest::testReadRejectsAKeywordThatIsNotAWordcallsDeclarationReaderTest::testReadRejectsAnUnknownKeywordcallsDeclarationReaderTest::testReadTokenClasscallsDeclarationReaderTest::testReadTokenClassRejectsAKnownNamecallsDeclarationReaderTest::testReadTokenClassRejectsATerminalNamecallsDeclarationReaderTest::testReadTypecallsDeclarationReaderTest::testReadTypeRejectsAMissingSymbolcallsDeclarationReaderTest::testReadTypeRejectsASecondTypecallsGrammarReaderTest::testPrecedencecallsGrammarReaderTest::testPrecedenceRejectsAMissingClosercallsGrammarReaderTest::testPrecedenceRejectsAMissingRulecallsGrammarReaderTest::testPrecedenceRejectsANonterminalcallsGrammarReaderTest::testPrecedenceRejectsASecondMarkcallsGrammarReaderTest::testReadcallsGrammarReaderTest::testReadRejectsAStrayTokencallsRuleReaderTest::testAliascallsRuleReaderTest::testAliasRejectsABadNamecallsRuleReaderTest::testAliasRejectsAMissingClosercallsRuleReaderTest::testHeadcallsRuleReaderTest::testHeadRejectsABadAliascallsRuleReaderTest::testHeadRejectsAMissingArrowcallsRuleReaderTest::testHeadRejectsAMissingArrowAfterTheAliascallsRuleReaderTest::testHeadRejectsAnUnclosedAliascallsRuleReaderTest::testReadcallsRuleReaderTest::testReadAcceptsAnEmptyRightHandSidecallsRuleReaderTest::testReadRejectsACompoundAtTheStartcallsRuleReaderTest::testReadRejectsALowerCaseCompoundcallsRuleReaderTest::testReadRejectsAnIllegalCharactercallsRuleReaderTest::testReadRejectsTheEndOfTheFilecallsSymbolListReaderTest::testClassTokenscallsSymbolListReaderTest::testClassTokensRejectsANonterminalcallsSymbolListReaderTest::testFallbackscallsSymbolListReaderTest::testFallbacksRejectsANonterminalcallsSymbolListReaderTest::testFallbacksRejectsASecondFallbackForATokencallsSymbolListReaderTest::testRankedcallsSymbolListReaderTest::testRankedRejectsANonterminalcallsSymbolListReaderTest::testTokenscallsSymbolListReaderTest::testTokensRejectsANonterminalcallsSymbolListReaderTest::testUntilPeriodcallsSymbolListReaderTest::testUntilPeriodRejectsTheEndOfTheFilecallsSymbolListReaderTest::testWildcardcallsSymbolListReaderTest::testWildcardRejectsANonterminalcallsSymbolListReaderTest::testWildcardRejectsASecondTokencalls