To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of interest (number of regular phones and premium phones produced), an objective function that represents the total profit, and constraints based on the limitations provided in the problem.

Let's denote:
- \(x_1\) as the number of regular phones produced per day,
- \(x_2\) as the number of premium phones produced per day.

The objective is to maximize the total profit. Given that each regular phone yields a profit of $200 and each premium phone yields a profit of $300, the objective function can be represented algebraically as:
\[ \text{Maximize: } 200x_1 + 300x_2 \]

The constraints are based on the following conditions:
1. The daily demand for regular phones is at most 20: \( x_1 \leq 20 \)
2. The daily demand for premium phones is at most 15: \( x_2 \leq 15 \)
3. The total number of phones sold per day cannot exceed 30: \( x_1 + x_2 \leq 30 \)
4. Both \(x_1\) and \(x_2\) must be non-negative since they represent quantities of phones: \( x_1 \geq 0, x_2 \geq 0 \)

Thus, the symbolic representation of the problem is:
```json
{
  'sym_variables': [('x1', 'number of regular phones'), ('x2', 'number of premium phones')],
  'objective_function': '200*x1 + 300*x2',
  'constraints': ['x1 <= 20', 'x2 <= 15', 'x1 + x2 <= 30', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this linear programming problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

# Create a new model
m = Model("phone_production")

# Add variables to the model
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="regular_phones")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="premium_phones")

# Set the objective function
m.setObjective(200*x1 + 300*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 <= 20, "regular_phone_limit")
m.addConstr(x2 <= 15, "premium_phone_limit")
m.addConstr(x1 + x2 <= 30, "total_phone_limit")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Regular phones: {x1.x}")
    print(f"Premium phones: {x2.x}")
    print(f"Total profit: ${200*x1.x + 300*x2.x:.2f}")
else:
    print("No optimal solution found")
```