# core URL: /api/parser/core/ Section: parser -------------------------------------------------------------------------------- core - Kida window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/kida/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/kida/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/kida/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/kida/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/kida/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/kida/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/kida/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/kida/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/kida/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/kida/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/kida/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/kida/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/kida/assets/js/enhancements/link-previews.8d906535.js' }; (function () { try { var defaults = window.BENGAL_THEME_DEFAULTS || { appearance: 'system', palette: '' }; var defaultAppearance = defaults.appearance; if (defaultAppearance === 'system') { defaultAppearance = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } var storedTheme = localStorage.getItem('bengal-theme'); var storedPalette = localStorage.getItem('bengal-palette'); var theme = storedTheme ? (storedTheme === 'system' ? defaultAppearance : storedTheme) : defaultAppearance; var palette = storedPalette ?? defaults.palette; document.documentElement.setAttribute('data-theme', theme); if (palette) { document.documentElement.setAttribute('data-palette', palette); } } catch (e) { document.documentElement.setAttribute('data-theme', 'light'); } })(); { "prerender": [ { "where": { "and": [ { "href_matches": "/docs/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ], "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ] } Skip to main content Magnifying Glass ESC Recent Clear Magnifying Glass No results for "" Start typing to search... ↑↓ Navigate ↵ Open ESC Close Powered by Lunr )彡 DocumentationInfoAboutArrow ClockwiseGet StartedCodeSyntaxTerminalUsageNoteTutorialsStarburstExtendingBookmarkReferenceTroubleshootingReleasesDevGitHubKida API Reference Magnifying Glass Search ⌘K Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal List )彡 Magnifying Glass Search X Close Documentation Caret Down Info About Arrow Clockwise Get Started Code Syntax Terminal Usage Note Tutorials Starburst Extending Bookmark Reference Troubleshooting Releases Dev Caret Down GitHub Kida API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Kida API Reference Caret Right Analysis analyzer cache config dependencies landmarks metadata purity roles Caret Right Compiler Caret Right Statements basic control_flow functions special_blocks template_structure variables _protocols coalescing core expressions utils Caret Right Environment core exceptions filters loaders protocols registry tests Caret Right Parser Caret Right Blocks control_flow core functions special_blocks template_structure variables _protocols core errors expressions statements tokens Caret Right Utils html lru_cache workers _types bytecode_cache kida lexer nodes template tstring Kida API ReferenceParser ᗢ Caret Down Link Copy URL External Open LLM text Copy Copy LLM text Share with AI Ask Claude Ask ChatGPT Ask Gemini Ask Copilot Module parser.core Core parser implementation for Kida. Combines all parsing mixins into a unified Parser class that transforms a token stream into an immutable Kida AST (Template node). Design: The Parser uses mixin inheritance to separate concerns while maintaining a single entry point. Each mixin handles one aspect of the grammar: TokenNavigationMixin: Token stream access, lookahead, expect/match BlockParsingMixin: Template structure (block, extends, include, def) StatementParsingMixin: Control flow (if, for, while), variables (set, let) ExpressionParsingMixin: Expressions, operators, filters, tests Block Stack: Uses a stack-based approach for unified {% end %} syntax. When any block is opened, it's pushed onto the stack. {% end %} always closes the innermost open block, like Go templates. Thread-Safety: Parser instances are single-use and not thread-safe. Create one parser per template compilation. The resulting AST is immutable and thread-safe. 1Class Classes Parser 9 ▼ Recursive descent parser transforming tokens into Kida AST. The Parser consumes a token stream and… Recursive descent parser transforming tokens into Kida AST. The Parser consumes a token stream and produces an immutable Template node representing the complete AST. All parsing state is instance-local, so parsers are single-use (create one per template). Block Stack Architecture: Uses a stack to track open blocks, enabling Kida's unified {% end %} syntax. When {% end %} is encountered, it closes the innermost block: ```jinja {% if condition %} {% for item in items %} {{ item }} {% end %} {# closes for #} {% end %} {# closes if #} ``` The stack stores `(block_type, lineno, col)` tuples for error reporting. Error Handling: Parse errors include source snippets with caret pointing to the error, plus contextual suggestions for common mistakes: ``` ParseError: Unclosed 'for' block - missing closing tag --> template.html:3:0 | 3 | {% for item in items %} | ^ Suggestion: Add '{% end %}' or '{% endfor %}' to close the block ``` Attributes Name Type Description _tokens — Sequence of Token objects from lexer _pos — Current position in token stream _name — Template name for error messages _filename — Source file path for error messages _source — Original source text for error context _autoescape — Whether to auto-escape output expressions _block_stack list[tuple[str, int, int]] Stack of open blocks for {% end %} matching Methods parse 0 Template ▼ Parse tokens into Template AST. def parse(self) -> Template Returns Template Internal Methods 1 ▼ __init__ 5 ▼ def __init__(self, tokens: Sequence[Token], name: str | None = None, filename: str | None = None, source: str | None = None, autoescape: bool = True) Parameters Name Type Description tokens — name — Default: None filename — Default: None source — Default: None autoescape — Default: True ← Previous _protocols Next → errors List © 2026 Kida built in ᓚᘏᗢ { "linkPreviews": { "enabled": true, "hoverDelay": 200, "hideDelay": 150, "showSection": true, "showReadingTime": true, "showWordCount": true, "showDate": true, "showTags": true, "maxTags": 3, "includeSelectors": [".prose"], "excludeSelectors": ["nav", ".toc", ".breadcrumb", ".pagination", ".card", "[class*='-card']", ".tab-nav", "[class*='-widget']", ".child-items", ".content-tiles"], "allowedHosts": [], "allowedSchemes": ["https"], "hostFailureThreshold": 3 } } window.BENGAL_LAZY_ASSETS = { tabulator: '/kida/assets/js/tabulator.min.js', dataTable: '/kida/assets/js/data-table.js', mermaidToolbar: '/kida/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/kida/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/kida/assets/js/graph-minimap.ff04e939.js', graphContextual: '/kida/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/kida/assets/icons/close.911d4fe1.svg', enlarge: '/kida/assets/icons/enlarge.652035e5.svg', copy: '/kida/assets/icons/copy.3d56e945.svg', 'download-svg': '/kida/assets/icons/download.04f07e1b.svg', 'download-png': '/kida/assets/icons/image.c34dfd40.svg', 'zoom-in': '/kida/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/kida/assets/icons/zoom-out.38857c77.svg', reset: '/kida/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 942 - Reading Time: 5 minutes