Skip to content

🧱 Library for parsing and validating TypeLang syntax and converting it into AST nodes

License

Notifications You must be signed in to change notification settings

php-type-language/parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

643e7d2 Â· Mar 10, 2025
Jan 11, 2025
Mar 3, 2024
Mar 10, 2025
Mar 10, 2025
Mar 6, 2025
Mar 2, 2024
Nov 4, 2023
Mar 2, 2024
Jun 29, 2024
Nov 28, 2022
Mar 6, 2025
Mar 6, 2025
Jan 10, 2025
Mar 6, 2025

Repository files navigation


PHP 8.1+ Latest Stable Version Latest Unstable Version License MIT MetaStorm

Reference implementation for TypeLang Parser.

TypeLang is a declarative type language inspired by static analyzers like PHPStan and Psalm.

Read documentation pages for more information.

Installation

TypeLang Parser is available as Composer repository and can be installed using the following command in a root of your project:

composer require type-lang/parser

Quick Start

$parser = new \TypeLang\Parser\Parser();

$type = $parser->parse(<<<'PHP'
    array{
        key: callable(Example, int): mixed,
        ...
    }
    PHP);

var_dump($type);

Expected Output:

TypeLang\Parser\Node\Stmt\NamedTypeNode {
  +offset: 0
  +name: TypeLang\Parser\Node\Name {
    +offset: 0
    -parts: array:1 [
      0 => TypeLang\Parser\Node\Identifier {
        +offset: 0
        +value: "array"
      }
    ]
  }
  +arguments: null
  +fields: TypeLang\Parser\Node\Stmt\Shape\FieldsListNode {
    +offset: 11
    +items: array:1 [
      0 => TypeLang\Parser\Node\Stmt\Shape\NamedFieldNode {
        +offset: 11
        +type: TypeLang\Parser\Node\Stmt\CallableTypeNode {
          +offset: 16
          +name: TypeLang\Parser\Node\Name {
            +offset: 16
            -parts: array:1 [
              0 => TypeLang\Parser\Node\Identifier {
                +offset: 16
                +value: "callable"
              }
            ]
          }
          +parameters: TypeLang\Parser\Node\Stmt\Callable\ParametersListNode {
            +offset: 25
            +items: array:2 [
              0 => TypeLang\Parser\Node\Stmt\Callable\ParameterNode {
                +offset: 25
                +type: TypeLang\Parser\Node\Stmt\NamedTypeNode {
                  +offset: 25
                  +name: TypeLang\Parser\Node\Name {
                    +offset: 25
                    -parts: array:1 [
                      0 => TypeLang\Parser\Node\Identifier {
                        +offset: 25
                        +value: "Example"
                      }
                    ]
                  }
                  +arguments: null
                  +fields: null
                }
                +name: null
                +output: false
                +variadic: false
                +optional: false
              }
              1 => TypeLang\Parser\Node\Stmt\Callable\ParameterNode {
                +offset: 34
                +type: TypeLang\Parser\Node\Stmt\NamedTypeNode {
                  +offset: 34
                  +name: TypeLang\Parser\Node\Name {
                    +offset: 34
                    -parts: array:1 [
                      0 => TypeLang\Parser\Node\Identifier {
                        +offset: 34
                        +value: "int"
                      }
                    ]
                  }
                  +arguments: null
                  +fields: null
                }
                +name: null
                +output: false
                +variadic: false
                +optional: false
              }
            ]
          }
          +type: TypeLang\Parser\Node\Stmt\NamedTypeNode {
            +offset: 40
            +name: TypeLang\Parser\Node\Name {
              +offset: 40
              -parts: array:1 [
                0 => TypeLang\Parser\Node\Identifier {
                  +offset: 40
                  +value: "mixed"
                }
              ]
            }
            +arguments: null
            +fields: null
          }
        }
        +optional: false
        +key: TypeLang\Parser\Node\Identifier {
          +offset: 11
          +value: "key"
        }
      }
    ]
    +sealed: false
  }
}