Currently parseListItem() returns null to indicate that the end of the list has been reached, and false to indicate that an invalid item was found but parsing of the remaining items should continue.
This is confusing, and the mixed type return value does not work well with static analysis tools like PHPStan.
Perhaps instead parseList() should have the responsibility for checking for the end of the list itself.