use Graphit\Parser\EBNFParserGenerator;
$EBNFFileContent = file_get_contents($EBNFFile);
+if ($EBNFFileContent === false) {
+ echo PHP_EOL;
+ echo "Unable to read $EBNFFile" . PHP_EOL;
+ exit(1);
+}
$result = EBNFParser::parse($EBNFFileContent);
if ($result === null) {
echo PHP_EOL;
}
$files = scandir($folder);
+ if ($files === false) {
+ return true;
+ }
+
return count($files) > 2;
}
<?php
namespace Graphit\Parser\EBNF;
-class AltResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class AltResult
{
/**
* @param list{ConcResult, PipeconclistResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous11Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous11Result
{
/**
* @param ',' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous14Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous14Result
{
/**
* @param string $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous16Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous16Result
{
/**
* @param string $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous18Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous18Result
{
/**
* @param string $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous20Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous20Result
{
/**
* @param string $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous22Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous22Result
{
/**
* @param '(' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous23Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous23Result
{
/**
* @param ')' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous25Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous25Result
{
/**
* @param '{' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous26Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous26Result
{
/**
* @param '}' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous28Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous28Result
{
/**
* @param '[' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous29Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous29Result
{
/**
* @param ']' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous2Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous2Result
{
/**
* @param '=' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous31Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous31Result
{
/**
* @param WhitespaceResult|CommentResult $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous3Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous3Result
{
/**
* @param ';' $result
<?php
namespace Graphit\Parser\EBNF;
-class Anonymous7Result
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous7Result
{
/**
* @param '|' $result
<?php
namespace Graphit\Parser\EBNF;
-class BarewordResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class BarewordResult
{
/**
* @param list{Anonymous14Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class CommatermResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommatermResult
{
/**
* @param list{Anonymous11Result, SpaceResult, TermResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class CommatermlistResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommatermlistResult
{
/**
* @param list<CommatermResult> $result
<?php
namespace Graphit\Parser\EBNF;
-class CommentResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommentResult
{
/**
* @param string $result
<?php
namespace Graphit\Parser\EBNF;
-class ConcResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class ConcResult
{
/**
* @param list{TermResult, CommatermlistResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class DqResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class DqResult
{
/**
* @param list{Anonymous18Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class EBNFParser
+final class EBNFParser
{
public static function parse(string $code): ?SyntaxResult
{
<?php
namespace Graphit\Parser\EBNF;
-class GroupResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class GroupResult
{
/**
* @param list{Anonymous22Result, SpaceResult, AltResult, Anonymous23Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class OptionalResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class OptionalResult
{
/**
* @param list{Anonymous28Result, SpaceResult, AltResult, Anonymous29Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class PipeconcResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class PipeconcResult
{
/**
* @param list{Anonymous7Result, SpaceResult, ConcResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class PipeconclistResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class PipeconclistResult
{
/**
* @param list<PipeconcResult> $result
<?php
namespace Graphit\Parser\EBNF;
-class RegexResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RegexResult
{
/**
* @param list{Anonymous20Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class RepetitionResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RepetitionResult
{
/**
* @param list{Anonymous25Result, SpaceResult, AltResult, Anonymous26Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class RuleResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RuleResult
{
/**
* @param list{BarewordResult, SpaceResult, Anonymous2Result, SpaceResult, AltResult, Anonymous3Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class RulesResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RulesResult
{
/**
* @param list<RuleResult> $result
<?php
namespace Graphit\Parser\EBNF;
-class SpaceResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SpaceResult
{
/**
* @param list<Anonymous31Result> $result
<?php
namespace Graphit\Parser\EBNF;
-class SqResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SqResult
{
/**
* @param list{Anonymous16Result, SpaceResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class SyntaxResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SyntaxResult
{
/**
* @param list{SpaceResult, RulesResult} $result
<?php
namespace Graphit\Parser\EBNF;
-class TermResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class TermResult
{
/**
* @param BarewordResult|SqResult|DqResult|RegexResult|GroupResult|RepetitionResult|OptionalResult $result
<?php
namespace Graphit\Parser\EBNF;
-class WhitespaceResult
+/** @psalm-suppress PossiblyUnusedProperty */
+final class WhitespaceResult
{
/**
* @param string $result
use Graphit\Parser\ParserType;
-class EBNFParserGenerator
+final class EBNFParserGenerator
{
/**
* @param array<string, ParserType> $transformResults
<?php
namespace <NAME_SPACE>;
- class <CLASS_NAME>
+ final class <CLASS_NAME>
{
<FUNCTIONS>
}
use Graphit\Parser\ParserType;
-class EBNFResultGenerator
+final class EBNFResultGenerator
{
/**
* @param array<string, ParserType> $transformResults
private static function classTemplate(string $className, string $phpType, ?string $psalmType = null): string
{
$template = <<<TEMPLATE
- class <CLASS_NAME>
+ /** @psalm-suppress PossiblyUnusedProperty */
+ final class <CLASS_NAME>
{<PSALM_TYPE>
public function __construct(
public readonly <PHP_TYPE> \$result,
*/
PSALM;
- if ($psalmType) {
+ if ($psalmType !== null) {
$psalmTemplate = strtr($psalmTemplate, [
'<PSALM_TYPE>' => $psalmType
]);
}
}
}
-
public abstract function needsDocType(): bool;
}
-class RuleType extends ParserType {
+final class RuleType extends ParserType {
private function __construct(
public readonly string $name
) {}
+ #[\Override]
public function asPHPType(): string {
return ucfirst($this->name).'Result';
}
+ #[\Override]
public function asDocType(): string {
return $this->asPHPType();
}
+ #[\Override]
public function needsDocType(): bool {
return false;
}
}
}
-class AnonType extends ParserType {
+final class AnonType extends ParserType {
private function __construct(
public readonly string $name
) {}
+ #[\Override]
public function asPHPType(): string {
return ucfirst($this->name).'Result';
}
+ #[\Override]
public function asDocType(): string {
return $this->asPHPType();
}
+ #[\Override]
public function needsDocType(): bool {
return false;
}
}
}
-class StringType extends ParserType {
+final class StringType extends ParserType {
private function __construct(
public readonly string $string
) {}
+ #[\Override]
public function asPHPType(): string {
return 'string';
}
+ #[\Override]
public function asDocType(): string {
return var_export($this->string, true);
}
+ #[\Override]
public function needsDocType(): bool {
return true;
}
}
}
-class RegexpType extends ParserType {
+final class RegexpType extends ParserType {
private function __construct(
public readonly string $regexp
) {}
+ #[\Override]
public function asPHPType(): string {
return 'string';
}
+ #[\Override]
public function asDocType(): string {
return $this->asPHPType();
}
+ #[\Override]
public function needsDocType(): bool {
return false;
}
}
}
-class ConcType extends ParserType {
+final class ConcType extends ParserType {
/** @param non-empty-list<ParserType> $types */
private function __construct(
public readonly array $types
) { }
+ #[\Override]
public function asPHPType(): string {
return 'array';
}
+ #[\Override]
public function asDocType(): string {
$types = [];
foreach($this->types as $type) {
return 'list{'.implode(', ', $types).'}';
}
+ #[\Override]
public function needsDocType(): bool {
return true;
}
}
}
-class UnionType extends ParserType {
+final class UnionType extends ParserType {
/** @param non-empty-array<string, ParserType> $types */
private function __construct(
public readonly array $types
) {}
+ #[\Override]
public function asPHPType(): string {
if ($this->needsDocType()) {
return 'mixed';
return $this->asDocType();
}
+ #[\Override]
public function asDocType(): string {
$types = [];
foreach($this->types as $type) {
return implode('|', $types);
}
+ #[\Override]
public function needsDocType(): bool {
foreach($this->types as $type) {
if ($type->needsDocType()) return true;
}
}
-class OptionalType extends ParserType {
+final class OptionalType extends ParserType {
private function __construct(
public readonly ParserType $type
) {}
+ #[\Override]
public function asPHPType(): string {
if ($this->needsDocType()) {
return 'mixed';
return $this->asDocType();
}
+ #[\Override]
public function asDocType(): string {
return '?'.$this->type->asDocType();
}
+ #[\Override]
public function needsDocType(): bool {
return $this->type->needsDocType();
}
}
}
-class RepetitionType extends ParserType {
+final class RepetitionType extends ParserType {
private function __construct(
public readonly ParserType $type
) {}
+ #[\Override]
public function asPHPType(): string {
return 'array';
}
+ #[\Override]
public function asDocType(): string {
return 'list<'.$this->type->asDocType().'>';
}
+ #[\Override]
public function needsDocType(): bool {
return true;
}
}
}
-class TypeInfos {
+final class TypeInfos {
/** @param array<string, ParserType> $named */
private function __construct(
}
}
-class EBNFTransform
+final class EBNFTransform
{
public static function toRuleName(BarewordResult $result): string {
return $result->result[0]->result;
return static::transformAlt($result->result[2])->repetition();
}
}
-
-
-
-
-