classPrecedenceDirectiveReader
final class PrecedenceDirectiveReader
implements BisonDirectiveReader
Restricted visibility: declared "@visibility root". Code outside that scope must not name this declaration.
Reads the four directives that rank operators against each other.
%left, %right, %nonassoc and %precedence differ only in the associativity they declare, and the directive name carries that, so one reader covers all four. Operators may be written as names or as quoted characters, and both spellings name the same terminal.
Methods§
public function __construct(BisonDeclarationBoundary|null $boundary = null)Parameters
$boundary | BisonDeclarationBoundary|null | Decides where the declaration ends |
Test cases 13
PrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#leftcoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#nonassoccoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#precedencecoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#rightcoversPrecedenceDirectiveReaderTest::testHandlesRejectsADirectiveThatDeclaresNoAssociativitycoversPrecedenceDirectiveReaderTest::testReadSkipsWhatIsNotAnOperatorcoversPrecedenceDirectiveReaderTest::testReadStopsAtTheSectionSeparatorcoversPrecedenceDirectiveReaderTest::testReadTakesOperatorsWrittenAsNamesOrAsCharacterscoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#leftcoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#nonassoccoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#precedencecoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#rightcoversPrecedenceDirectiveReaderTest::testReadTakesTheOptionalTypeTagcovers
Calls 1
public function handles(string $directive): boolReports whether the directive declares an associativity.
Parameters
$directive | string | Directive name including its percent sign |
Returns
bool True for "%left", "%right", "%nonassoc" and "%precedence"Test cases 6
PrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirectivecallsPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#leftcoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#nonassoccoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#precedencecoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#rightcoversPrecedenceDirectiveReaderTest::testHandlesRejectsADirectiveThatDeclaresNoAssociativitycovers and calls
public function read(BisonTokenStream $stream, string $directive): BisonDeclarationConsumes the optional type tag and the operators being ranked.
Parameters
$stream | BisonTokenStream | Stream positioned just after the directive name |
$directive | string | Directive name including its percent sign |
Returns
BisonDeclaration The declaration, with no operators when none followedTest cases 9
PrecedenceDirectiveReaderTest::testReadSkipsWhatIsNotAnOperatorcovers and callsPrecedenceDirectiveReaderTest::testReadStopsAtTheSectionSeparatorcovers and callsPrecedenceDirectiveReaderTest::testReadTakesOperatorsWrittenAsNamesOrAsCharacterscovers and callsPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveNamecallsPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#leftcoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#nonassoccoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#precedencecoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#rightcoversPrecedenceDirectiveReaderTest::testReadTakesTheOptionalTypeTagcovers and calls
Calls 9
- function-call
substrline 64 - method-call BisonTokenStream::nextIf() line 66
- class-const BisonLexeme::TypeTag() line 66
- method-call BisonDeclarationBoundary::continuesWith() line 70
- method-call BisonTokenStream::peek() line 70
- class-const BisonLexeme::Identifier() line 71
- class-const BisonLexeme::CharLiteral() line 71
- method-call BisonTokenStream::next() line 73
- new BisonPrecedenceDeclaration line 80
Private surface 1§
Implementation details, listed for orientation only.
private BisonDeclarationBoundary $boundaryTest cases 19§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 15
PrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirectivecallsPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#leftcoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#nonassoccoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#precedencecoversPrecedenceDirectiveReaderTest::testHandlesClaimsEveryAssociativityDirective#rightcoversPrecedenceDirectiveReaderTest::testHandlesRejectsADirectiveThatDeclaresNoAssociativitycovers and callsPrecedenceDirectiveReaderTest::testReadSkipsWhatIsNotAnOperatorcovers and callsPrecedenceDirectiveReaderTest::testReadStopsAtTheSectionSeparatorcovers and callsPrecedenceDirectiveReaderTest::testReadTakesOperatorsWrittenAsNamesOrAsCharacterscovers and callsPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveNamecallsPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#leftcoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#nonassoccoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#precedencecoversPrecedenceDirectiveReaderTest::testReadTakesTheAssociativityFromTheDirectiveName#rightcoversPrecedenceDirectiveReaderTest::testReadTakesTheOptionalTypeTagcovers and calls