twigphp/Twig · error · SyntaxError
The lexer or the parser ended up in an unsupported state.
Error message
The lexer or the parser ended up in an unsupported state.
What it means
This is a defensive internal error: Parser::subparse's switch reached a default branch for a token type it cannot handle (only BLOCK_START, VAR_START and COMMENT_START are expected). It means the lexer produced a token sequence the parser was not designed to receive, i.e. an internal invariant violation rather than a user syntax problem.
Solutions
- Ensure all twig/twig packages are at one consistent version (composer update / composer why-not)
- Remove or fix custom Lexer/Parser subclasses or overrides
- Reproduce with a minimal template and stock Twig configuration to isolate the custom code
- Report to the extension maintainer if a third-party lexer/parser hook causes it
Example fix
// before composer require twig/twig:^3.9 # while another package pins ^3.0 // after composer update twig/twig # resolve so a single twig/twig version is installed
Defensive patterns
Strategy: try-catch
Validate before calling
// verify consistent twig/twig version: composer show twig/twig and composer why-not twig/twig
Try / catch
try { $env->render($name); } catch (\Twig\Error\SyntaxError $e) { if (str_contains($e->getMessage(), 'unsupported state')) { /* internal inconsistency: check custom lexers/parsers and version pins */ } } Prevention
- Keep a single twig/twig version across the dependency tree
- Avoid subclassing/monkey-patching Lexer or Parser
- Test custom extensions against stock Twig with minimal templates
When it happens
Trigger: The lexer emitted a token type other than BLOCK_START_TYPE/VAR_START_TYPE/COMMENT_START_TYPE at a position where subparse expects markup; typically caused by a custom Lexer/TokenStream modification, a broken subclass overriding lexer/parser internals, or a Twig core version mismatch.
Common situations: Custom Twig extensions or forks that alter token types; mismatched twig/twig3 component versions after a partial dependency upgrade; monkey-patching or decorating the Lexer incorrectly.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- Unclosed " ".
- Unexpected character
- Unexpected end of file: Unclosed "verbatim" block.
- Unclosed comment.
- Unexpected " ".
AI-assisted analysis of twigphp/Twig@a414c3a491 (2026-09-13).
Data as JSON: /api/errors/33a8d97dce961b21.
Report an issue: GitHub.
Appendix: source
Thrown at src/Parser.php:256
$node = $subparser->parse($token);
$documentationTarget = $this->documentationTargets[$documentationTargetIndex];
} finally {
array_pop($this->documentationTargets);
}
if (!$node) {
trigger_deprecation('twig/twig', '3.12', 'Returning "null" from "%s" is deprecated and forbidden by "TokenParserInterface".', $subparser::class);
} else {
$node->setNodeTag($subparser->getTag());
NodeDocumentation::add($node, $startToken);
if (null !== $documentationTarget && $node !== $documentationTarget) {
NodeDocumentation::move($node, $documentationTarget);
}
$rv[] = $node;
}
break;
default:
throw new SyntaxError('The lexer or the parser ended up in an unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext());
}
}
if (1 === \count($rv)) {
return $rv[0];
}
return new Nodes($rv, $lineno);
}
public function getBlockStack(): array
{
trigger_deprecation('twig/twig', '3.12', 'Method "%s()" is deprecated.', __METHOD__);
return $this->blockStack;
}
/**View on GitHub (pinned to a414c3a491)