To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of lumbers and plywood produced, expressing the objective function in terms of these variables, and listing all constraints based on the given resources and requirements.

Let's define:
- $x_1$ as the number of lumbers produced,
- $x_2$ as the number of plywood produced.

The objective is to maximize profit. Given that each lumber provides a profit of $10 and each plywood provides a profit of $35, the objective function can be written as:
\[ \text{Maximize: } 10x_1 + 35x_2 \]

The constraints are based on the available worker-hours, machine-hours, and the minimum production requirements for lumbers and plywood. Specifically:
- Each lumber requires 3 worker-hours, so $x_1$ lumbers require $3x_1$ worker-hours.
- Each plywood requires 2 worker-hours, so $x_2$ plywood require $2x_2$ worker-hours.
- The total available worker-hours are 2500, leading to the constraint: $3x_1 + 2x_2 \leq 2500$.
- Each lumber requires 8 machine-hours, so $x_1$ lumbers require $8x_1$ machine-hours.
- Each plywood requires 12 machine-hours, so $x_2$ plywood require $12x_2$ machine-hours.
- The total available machine-hours are 4000, leading to the constraint: $8x_1 + 12x_2 \leq 4000$.
- The factory must produce at least 200 lumbers, leading to the constraint: $x_1 \geq 200$.
- The factory must produce at least 300 plywood, leading to the constraint: $x_2 \geq 300$.

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of lumbers'), ('x2', 'number of plywood')],
    'objective_function': '10*x1 + 35*x2',
    'constraints': [
        '3*x1 + 2*x2 <= 2500',
        '8*x1 + 12*x2 <= 4000',
        'x1 >= 200',
        'x2 >= 300'
    ]
}
```

To solve this problem using Gurobi in Python, we can use the following code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(name="lumbers", vtype=GRB.INTEGER)
x2 = m.addVar(name="plywood", vtype=GRB.INTEGER)

# Set objective function
m.setObjective(10*x1 + 35*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3*x1 + 2*x2 <= 2500, name="worker_hours")
m.addConstr(8*x1 + 12*x2 <= 4000, name="machine_hours")
m.addConstr(x1 >= 200, name="min_lumbers")
m.addConstr(x2 >= 300, name="min_plywood")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Lumbers: {x1.x}")
    print(f"Plywood: {x2.x}")
    print(f"Max Profit: {m.objVal}")
else:
    print("No optimal solution found.")
```