Why prompts and retries can't get to zero
A language model samples each token from a distribution, and even a model that's seen your language fluently assigns some nonzero probability to a token that breaks it — a mismatched bracket, an undefined keyword, a missing separator. Over enough generations that token eventually gets drawn. Adding 'output only valid syntax' to the prompt lowers the odds; it doesn't remove the bad tokens from the distribution.
Retrying on a failed parse helps but is expensive and unbounded: nothing guarantees the second attempt parses either, and you've now doubled latency and cost on the path that was already going wrong. You're treating the symptom every time instead of the cause.
Making invalid output unreachable
dsl.ai takes the bad tokens off the menu. It compiles your language's grammar into a decoding constraint, so at every step the model can only sample from tokens that keep the output inside the grammar. A bracket that wouldn't close, a keyword that doesn't exist, a statement that breaks the structure — those aren't unlikely, they're simply not available to sample. The output can't be syntactically wrong because the wrong paths were never reachable.
This is the same mechanism behind GBNF grammars in llama.cpp, Outlines, and XGrammar; dsl.ai's job is to compile your grammar into it from a file you paste, no GPU and no training set. And because syntax is guaranteed, the model spends its probability mass on the choices that actually matter — what the code should do — rather than on whether it parses.
Confirm it, don't trust it
Guaranteeing generation is half the story; you still want to confirm any given string is valid — including DSL a human wrote, not just what the model produced. dsl.ai generates a deterministic parser from the same grammar, so checking is exact and reproducible: valid, or invalid at a specific position with what it expected there. A parser names the failure; a model asked to grade itself can be confidently wrong.
how it works
- 01
paste your grammar
Drop your language's EBNF/GBNF-style grammar into dsl.ai — no training data needed.
- 02
compile the constraint
dsl.ai turns the grammar into a decoding mask that removes every token that would break the syntax.
- 03
generate under the constraint
The model produces output that's syntactically valid by construction, with no retry loop.
- 04
verify with the parser
Run any string through the deterministic validator to confirm it, or see the exact position it breaks.
frequently asked
- Can't I just add a retry-on-parse-failure loop?
- You can, but it's unbounded and costly: nothing guarantees the retry parses either, and you've doubled latency on the failing path. A decoding constraint removes the invalid tokens so the first attempt is already valid.
- Does constraining limit what the model can write?
- It only removes syntactically illegal options. The model still chooses freely among everything the grammar allows, so it spends its effort on the meaning of the output rather than on whether it parses.
- Will this catch semantic mistakes too?
- No — a grammar constraint guarantees syntax, not meaning. For semantic checks you'd add validation rules or, for hard cases, fine-tune a small model on top. dsl.ai leads with the syntactic guarantee because that's where the avoidable failures are.
- Does it work for code as well as config DSLs?
- Yes — anything you can express as a grammar, from a programming language subset to a config or query dialect. If a parser can describe it, dsl.ai can constrain generation to it.
Last updated June 8, 2026