code: private function parseTypeSystemDefinition()
      {
          // Many definitions begin with a description and require a lookahead.
          $keywordToken = $this->peekDescription()
              ? $this->lexer->lookahead()
              : $this->lexer->token;
  
          if ($keywordToken->kind === Token::NAME) {
              switch ($keywordToken->value) {
                  case 'schema':
                      return $this->parseSchemaDefinition();
                  case 'scalar':
                      return $this->parseScalarTypeDefinition();
                  case 'type':
                      return $this->parseObjectTypeDefinition();
                  case 'interface':
                      return $this->parseInterfaceTypeDefinition();
                  case 'union':
                      return $this->parseUnionTypeDefinition();
                  case 'enum':
                      return $this->parseEnumTypeDefinition();
                  case 'input':
                      return $this->parseInputObjectTypeDefinition();
                  case 'extend':
                      return $this->parseTypeExtension();
                  case 'directive':
                      return $this->parseDirectiveDefinition();
              }
          }
  
          throw $this->unexpected($keywordToken);
      }
docs: TypeSystemDefinition :
  - SchemaDefinition
  - TypeDefinition
  - TypeExtension
  - DirectiveDefinition
  
  TypeDefinition :
  - ScalarTypeDefinition
  - ObjectTypeDefinition
  - InterfaceTypeDefinition
  - UnionTypeDefinition
  - EnumTypeDefinition
  - InputObjectTypeDefinition
  
  @return TypeSystemDefinitionNode
  
  @throws SyntaxError