Constrained Decoding: Grammar-Guided Generation for Structured LLM Output
Valid next tokens at each step of expression building:
After (empty) → valid: ['(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "3" → valid: ['*', '+', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "3+" → valid: ['(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "3+4" → valid: ['*', '+', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "(" → valid: ['(', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "(2" → valid: [')', '*', '+', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
After "(2+3" → valid: [')', '*', '+', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']