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 road bikes and mountain bikes produced, expressing the objective function (profit) in terms of these variables, and formulating the constraints based on the time limitations of the grinder and polisher machines.

Let's denote:
- \(x_1\) as the number of road bikes produced,
- \(x_2\) as the number of mountain bikes produced.

The profit from selling one road bike is $70, and from selling one mountain bike is $100. Thus, the objective function to maximize profit (\(P\)) can be written as:
\[ P = 70x_1 + 100x_2 \]

The constraints are based on the time usage of each machine:
- Each road bike requires 3 hours on the grinder and 2 hours on the polisher.
- Each mountain bike requires 5 hours on the grinder and 2.5 hours on the polisher.
- The maximum usage for each machine (grinder and polisher) is 12 hours per day.

Therefore, the constraints can be formulated as follows:
1. Grinder time constraint: \(3x_1 + 5x_2 \leq 12\)
2. Polisher time constraint: \(2x_1 + 2.5x_2 \leq 12\)

Additionally, since we cannot produce a negative number of bikes, we have non-negativity constraints:
- \(x_1 \geq 0\)
- \(x_2 \geq 0\)

The symbolic representation of the problem is thus:
```json
{
    'sym_variables': [('x1', 'number of road bikes'), ('x2', 'number of mountain bikes')],
    'objective_function': '70*x1 + 100*x2',
    'constraints': ['3*x1 + 5*x2 <= 12', '2*x1 + 2.5*x2 <= 12', 'x1 >= 0', 'x2 >= 0']
}
```

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

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(name="road_bikes", vtype=GRB.CONTINUOUS, lb=0)
x2 = m.addVar(name="mountain_bikes", vtype=GRB.CONTINUOUS, lb=0)

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

# Add constraints
m.addConstr(3*x1 + 5*x2 <= 12, name="grinder_time")
m.addConstr(2*x1 + 2.5*x2 <= 12, name="polisher_time")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Road bikes: {x1.x}")
    print(f"Mountain bikes: {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```