function ParseEntity(TokenStream $it) { $entity = new ASTEntity(); $it->getToken(SyntaxMap::Keyword); $identifier = $it->getToken(SyntaxMap::Identifier); $entity->table = $identifier->value; //Verify that entity is not redeclared $key = strtolower($identifier->value); if (isset($it->entities[$key])) { throw ParserException::redeclaredEntity($identifier); } else { $it->entities[$key] = []; } // Parse table name if ($it->typeAt(SyntaxMap::OpenParen, 0)) { $it->getToken(SyntaxMap::OpenParen); $tableName = $it->getToken(SyntaxMap::Identifier); $it->getToken(SyntaxMap::CloseParen); $entity->table = $tableName->value; } $it->getToken(SyntaxMap::OpenBrace); $entity->name = $identifier->value; while (!$it->typeAt(SyntaxMap::CloseBrace, 0)) { $field = ParseField($it, $entity); $entity->fields[] = $field; } $it->getAndMove(); return $entity; }