CINXE.COM
模組:Parser - 维基词典,自由的多语言词典
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-not-available" lang="zh" dir="ltr"> <head> <meta charset="UTF-8"> <title>模組:Parser - 维基词典,自由的多语言词典</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-not-available";var cookie=document.cookie.match(/(?:^|; )zhwiktionarymwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"zh","wgMonthNames":["","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"wgRequestId":"11c326d9-9141-458d-bce7-f57987698989","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:Parser","wgTitle":"Parser","wgCurRevisionId":8782728,"wgRevisionId":8782728,"wgArticleId":2368130,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["未分類模塊","需要說明文檔的模板和模組"],"wgPageViewLanguage":"zh","wgPageContentLanguage":"zh","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:Parser","wgRelevantArticleId":2368130,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["autoconfirmed"],"wgRestrictionMove":["autoconfirmed"],"wgNoticeProject":"wiktionary","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault": true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q123551062","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.gadget.Palette":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles": "ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.edit0","ext.gadget.Hashcheck","ext.gadget.defaultVisibilityToggles","ext.gadget.catfix","ext.gadget.collapsibleTables","ext.gadget.CodeLinks","ext.gadget.zhDialMap","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","wikibase.client.vector-2022","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=zh&modules=ext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=zh&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=zh&modules=ext.gadget.Palette&only=styles&skin=vector-2022"> <link rel="stylesheet" href="/w/load.php?lang=zh&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="Wiktionary"> <meta property="og:title" content="模組:Parser - 维基词典,自由的多语言词典"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//zh.m.wiktionary.org/wiki/Module:Parser"> <link rel="apple-touch-icon" href="/static/apple-touch/wiktionary.png"> <link rel="icon" href="/static/favicon/piece.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wiktionary (zh)"> <link rel="EditURI" type="application/rsd+xml" href="//zh.wiktionary.org/w/api.php?action=rsd"> <link rel="canonical" href="https://zh.wiktionary.org/wiki/Module:Parser"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh"> <link rel="alternate" type="application/atom+xml" title="Wiktionary的Atom feed" href="/w/index.php?title=Special:%E6%9C%80%E8%BF%91%E6%9B%B4%E6%94%B9&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_Parser rootpage-Module_Parser skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">跳转到内容</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="站点"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="主菜单" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">主菜单</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">主菜单</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">移至侧栏</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">隐藏</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> 导航 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpagedisplay" class="mw-list-item"><a href="/wiki/Wiktionary:%E9%A6%96%E9%A1%B5"><span>首页</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wiktionary:%E7%A4%BE%E7%BE%A4%E9%A6%96%E9%A0%81" title="关于本计划,您可做的事,何处找到您所需"><span>社群首頁</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:%E6%9C%80%E8%BF%91%E6%9B%B4%E6%94%B9" title="本wiki的最近更改列表[r]" accesskey="r"><span>最近更改</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:%E9%9A%8F%E6%9C%BA%E9%A1%B5%E9%9D%A2" title="随机加载页面[x]" accesskey="x"><span>随机页面</span></a></li> </ul> </div> </div> <div id="p-help" class="vector-menu mw-portlet mw-portlet-help" > <div class="vector-menu-heading"> 帮助 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Wiktionary:%E5%B8%AE%E5%8A%A9" title="查找帮助的地方"><span>帮助</span></a></li><li id="n-Beerparlour" class="mw-list-item"><a href="/wiki/Wiktionary:%E5%95%A4%E9%85%92%E9%A6%86"><span>啤酒馆</span></a></li><li id="n-Tearoom" class="mw-list-item"><a href="/wiki/Wiktionary:%E8%8C%B6%E5%AE%A4"><span>茶室</span></a></li><li id="n-policy" class="mw-list-item"><a href="/wiki/Wiktionary:%E6%96%B9%E9%92%88%E4%B8%8E%E6%8C%87%E5%BC%95"><span>方针与指引</span></a></li><li id="n-wanted-text" class="mw-list-item"><a href="/wiki/Special:%E9%9C%80%E8%A6%81%E7%9A%84%E9%A1%B5%E9%9D%A2"><span>待撰页面</span></a></li><li id="n-allpages" class="mw-list-item"><a href="/wiki/Special:%E6%89%80%E6%9C%89%E9%A1%B5%E9%9D%A2"><span>所有页面</span></a></li><li id="n-contact" class="mw-list-item"><a href="/wiki/Wiktionary:%E5%8D%B3%E6%99%82%E8%81%AF%E7%B5%A1"><span>即時聯絡</span></a></li><li id="n-about" class="mw-list-item"><a href="/wiki/Wiktionary:%E5%85%B3%E4%BA%8E"><span>关于</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Wiktionary:%E9%A6%96%E9%A1%B5" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wiktionary.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="维基词典" src="/static/images/mobile/copyright/wiktionary-wordmark-zh.svg" style="width: 7.5em; height: 1.75em;"> <img class="mw-logo-tagline" alt="自由的多语言词典" src="/static/images/mobile/copyright/wiktionary-tagline-zh.svg" width="120" height="14" style="width: 7.5em; height: 0.875em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:%E6%90%9C%E7%B4%A2" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="搜索维基词典[f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>搜索</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="搜索维基词典" aria-label="搜索维基词典" autocapitalize="none" title="搜索维基词典[f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:搜索"> </div> <button class="cdx-button cdx-search-input__end-button">搜索</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="个人工具"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="外观"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="更改页面字体大小、宽度和颜色的外观" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="外观" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">外观</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_zh.wiktionary.org&uselang=zh" class=""><span>资助</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:%E5%88%9B%E5%BB%BA%E8%B4%A6%E6%88%B7&returnto=Module%3AParser" title="我们推荐您创建账号并登录,但这不是强制性的" class=""><span>创建账号</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95&returnto=Module%3AParser" title="我们推荐您登录,但这不是强制性的[o]" accesskey="o" class=""><span>登录</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="更多选项" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="个人工具" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">个人工具</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="用户菜单" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_zh.wiktionary.org&uselang=zh"><span>资助</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:%E5%88%9B%E5%BB%BA%E8%B4%A6%E6%88%B7&returnto=Module%3AParser" title="我们推荐您创建账号并登录,但这不是强制性的"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>创建账号</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95&returnto=Module%3AParser" title="我们推荐您登录,但这不是强制性的[o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>登录</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> 未登录编辑者的页面 <a href="/wiki/Help:%E6%96%B0%E6%89%8B%E5%85%A5%E9%97%A8" aria-label="了解有关编辑的更多信息"><span>了解详情</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:%E6%88%91%E7%9A%84%E8%B4%A1%E7%8C%AE" title="来自此IP地址的编辑列表[y]" accesskey="y"><span>贡献</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:%E6%88%91%E7%9A%84%E8%AE%A8%E8%AE%BA%E9%A1%B5" title="有关本IP地址编辑的讨论[n]" accesskey="n"><span>讨论</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="站点"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">模組</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">Parser</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="前往另一种语言写成的文章。18种语言可用" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-18" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">18种语言</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wiktionary.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:parser" title="وحدة:parser – 阿拉伯语" lang="ar" hreflang="ar" data-title="وحدة:parser" data-language-autonym="العربية" data-language-local-name="阿拉伯语" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-bjn mw-list-item"><a href="https://bjn.wiktionary.org/wiki/Modul:parser" title="Modul:parser – 班亞爾文" lang="bjn" hreflang="bjn" data-title="Modul:parser" data-language-autonym="Banjar" data-language-local-name="班亞爾文" class="interlanguage-link-target"><span>Banjar</span></a></li><li class="interlanguage-link interwiki-bn mw-list-item"><a href="https://bn.wiktionary.org/wiki/%E0%A6%AE%E0%A6%A1%E0%A6%BF%E0%A6%89%E0%A6%B2:parser" title="মডিউল:parser – 孟加拉语" lang="bn" hreflang="bn" data-title="মডিউল:parser" data-language-autonym="বাংলা" data-language-local-name="孟加拉语" class="interlanguage-link-target"><span>বাংলা</span></a></li><li class="interlanguage-link interwiki-ckb mw-list-item"><a href="https://ckb.wiktionary.org/wiki/%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:parser" title="مۆدیوول:parser – 中库尔德语" lang="ckb" hreflang="ckb" data-title="مۆدیوول:parser" data-language-autonym="کوردی" data-language-local-name="中库尔德语" class="interlanguage-link-target"><span>کوردی</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wiktionary.org/wiki/Module:parser" title="Module:parser – 英语" lang="en" hreflang="en" data-title="Module:parser" data-language-autonym="English" data-language-local-name="英语" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-hsb mw-list-item"><a href="https://hsb.wiktionary.org/wiki/Modul:parser" title="Modul:parser – 上索布语" lang="hsb" hreflang="hsb" data-title="Modul:parser" data-language-autonym="Hornjoserbsce" data-language-local-name="上索布语" class="interlanguage-link-target"><span>Hornjoserbsce</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wiktionary.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:parser" title="モジュール:parser – 日语" lang="ja" hreflang="ja" data-title="モジュール:parser" data-language-autonym="日本語" data-language-local-name="日语" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ky mw-list-item"><a href="https://ky.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:parser" title="Модуль:parser – 柯尔克孜语" lang="ky" hreflang="ky" data-title="Модуль:parser" data-language-autonym="Кыргызча" data-language-local-name="柯尔克孜语" class="interlanguage-link-target"><span>Кыргызча</span></a></li><li class="interlanguage-link interwiki-mnw mw-list-item"><a href="https://mnw.wiktionary.org/wiki/%E1%80%99%E1%80%9D%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0:parser" title="မဝ်ဂျူ:parser – Mon" lang="mnw" hreflang="mnw" data-title="မဝ်ဂျူ:parser" data-language-autonym="ဘာသာမန်" data-language-local-name="Mon" class="interlanguage-link-target"><span>ဘာသာမန်</span></a></li><li class="interlanguage-link interwiki-ms mw-list-item"><a href="https://ms.wiktionary.org/wiki/Modul:parser" title="Modul:parser – 马来语" lang="ms" hreflang="ms" data-title="Modul:parser" data-language-autonym="Bahasa Melayu" data-language-local-name="马来语" class="interlanguage-link-target"><span>Bahasa Melayu</span></a></li><li class="interlanguage-link interwiki-mt mw-list-item"><a href="https://mt.wiktionary.org/wiki/Module:parser" title="Module:parser – 马耳他语" lang="mt" hreflang="mt" data-title="Module:parser" data-language-autonym="Malti" data-language-local-name="马耳他语" class="interlanguage-link-target"><span>Malti</span></a></li><li class="interlanguage-link interwiki-my mw-list-item"><a href="https://my.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:parser" title="မော်ဂျူး:parser – 缅甸语" lang="my" hreflang="my" data-title="မော်ဂျူး:parser" data-language-autonym="မြန်မာဘာသာ" data-language-local-name="缅甸语" class="interlanguage-link-target"><span>မြန်မာဘာသာ</span></a></li><li class="interlanguage-link interwiki-pa mw-list-item"><a href="https://pa.wiktionary.org/wiki/%E0%A8%AE%E0%A9%8C%E0%A8%A1%E0%A8%BF%E0%A8%8A%E0%A8%B2:parser" title="ਮੌਡਿਊਲ:parser – 旁遮普语" lang="pa" hreflang="pa" data-title="ਮੌਡਿਊਲ:parser" data-language-autonym="ਪੰਜਾਬੀ" data-language-local-name="旁遮普语" class="interlanguage-link-target"><span>ਪੰਜਾਬੀ</span></a></li><li class="interlanguage-link interwiki-shn mw-list-item"><a href="https://shn.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%82%83%E1%82%87%E1%81%B5%E1%80%BB%E1%80%B0%E1%80%B8:parser" title="မေႃႇၵျူး:parser – 掸语" lang="shn" hreflang="shn" data-title="မေႃႇၵျူး:parser" data-language-autonym="ၽႃႇသႃႇတႆး " data-language-local-name="掸语" class="interlanguage-link-target"><span>ၽႃႇသႃႇတႆး </span></a></li><li class="interlanguage-link interwiki-si mw-list-item"><a href="https://si.wiktionary.org/wiki/Module:parser" title="Module:parser – 僧伽罗语" lang="si" hreflang="si" data-title="Module:parser" data-language-autonym="සිංහල" data-language-local-name="僧伽罗语" class="interlanguage-link-target"><span>සිංහල</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:parser" title="Модул:parser – 塞尔维亚语" lang="sr" hreflang="sr" data-title="Модул:parser" data-language-autonym="Српски / srpski" data-language-local-name="塞尔维亚语" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wiktionary.org/wiki/%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:parser" title="มอดูล:parser – 泰语" lang="th" hreflang="th" data-title="มอดูล:parser" data-language-autonym="ไทย" data-language-local-name="泰语" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wiktionary.org/wiki/M%C3%B4_%C4%91un:parser" title="Mô đun:parser – 越南语" lang="vi" hreflang="vi" data-title="Mô đun:parser" data-language-autonym="Tiếng Việt" data-language-local-name="越南语" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q123551062#sitelinks-wiktionary" title="编辑跨语言链接" class="wbc-editpage">编辑链接</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="命名空间"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:Parser" title="查看模块页面[c]" accesskey="c"><span>模块</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module_talk:Parser&action=edit&redlink=1" rel="discussion" class="new" title="有关内容页面的讨论(页面不存在)[t]" accesskey="t"><span>讨论</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="更改语言变体" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="查看"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:Parser"><span>阅读</span></a></li><li id="ca-viewsource" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:Parser&action=edit" title="本页面受到保护。 您可以查看其源代码[e]" accesskey="e"><span>查看源代码</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:Parser&action=history" title="该页面过去的修订[h]" accesskey="h"><span>查看历史</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="页面工具"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="工具箱" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">工具箱</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">工具</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">移至侧栏</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">隐藏</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="更多选项" > <div class="vector-menu-heading"> 操作 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Module:Parser"><span>阅读</span></a></li><li id="ca-more-viewsource" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:Parser&action=edit"><span>查看源代码</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:Parser&action=history"><span>查看历史</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> 常规 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:%E9%93%BE%E5%85%A5%E9%A1%B5%E9%9D%A2/Module:Parser" title="所有链接至本页面的wiki页面列表[j]" accesskey="j"><span>链入页面</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:%E9%93%BE%E5%87%BA%E6%9B%B4%E6%94%B9/Module:Parser" rel="nofollow" title="链自本页的页面的最近更改[k]" accesskey="k"><span>相关更改</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=zh" title="上传文件[u]" accesskey="u"><span>上传文件</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:%E7%89%B9%E6%AE%8A%E9%A1%B5%E9%9D%A2" title="所有特殊页面的列表[q]" accesskey="q"><span>特殊页面</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Module:Parser&oldid=8782728" title="此页面该修订版本的固定链接"><span>永久链接</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Module:Parser&action=info" title="关于此页面的更多信息"><span>页面信息</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:URL%E7%BC%A9%E7%9F%AD%E7%A8%8B%E5%BA%8F&url=https%3A%2F%2Fzh.wiktionary.org%2Fwiki%2FModule%3AParser"><span>获取短链接</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fzh.wiktionary.org%2Fwiki%2FModule%3AParser"><span>下载二维码</span></a></li> </ul> </div> </div> <div id="p-electronpdfservice-sidebar-portlet-heading" class="vector-menu mw-portlet mw-portlet-electronpdfservice-sidebar-portlet-heading" > <div class="vector-menu-heading"> 打印/导出 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="electron-print_pdf" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Module%3AParser&action=show-download-screen"><span>下载为PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="本页面的可打印版本[p]" accesskey="p"><span>打印页面</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> 在其他项目中 </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q123551062" title="链接到连接的数据仓库项目[g]" accesskey="g"><span>维基数据项目</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="页面工具"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="外观"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">外观</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">移至侧栏</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">隐藏</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">維基詞典,自由的多語言詞典</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="zh" dir="ltr"><div class="documentation" style="display:block; clear:both"> <hr /> <dl class="plainlinks" style="font-size: smaller;"><dd><i style="font-size: larger;">此模块缺少<a href="/wiki/Help:%E7%82%BA%E6%A8%A1%E6%9D%BF%E5%92%8C%E6%A8%A1%E7%B5%84%E6%92%B0%E5%AF%AB%E8%AA%AA%E6%98%8E%E6%96%87%E6%AA%94" title="Help:為模板和模組撰寫說明文檔">說明文檔</a>。請<a class="external text" href="https://zh.wiktionary.org/w/index.php?title=Module:Parser/doc&action=edit&preload=Template%3Adocumentation%2FpreloadModule">協助創建</a>。</i></dd> <dd> 相關連結:<a href="/wiki/Special:%E5%89%8D%E7%BC%80%E7%B4%A2%E5%BC%95/Module:Parser/" title="Special:前缀索引/Module:Parser/">子頁面列表</a> • <a class="external text" href="https://zh.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3AParser&hidetrans=1&hideredirs=1">链入</a> • <a class="external text" href="https://zh.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3AParser&hidelinks=1&hideredirs=1">嵌入包含</a> • <a href="/w/index.php?title=Module:Parser/testcases&action=edit&redlink=1" class="new" title="Module:Parser/testcases(页面不存在)">測試用例</a> • <a href="/w/index.php?title=Module:Parser/sandbox&action=edit&redlink=1" class="new" title="Module:Parser/sandbox(页面不存在)">沙盒</a></dd></dl> <br style="clear: both;" /></div><div class="mw-highlight mw-highlight-lang-lua mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos" data-line="1"></span></a><span class="kd">local</span> <span class="n">export</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></span></a> </span><span id="L-3"><a href="#L-3"><span class="linenos" data-line="3"></span></a><span class="kd">local</span> <span class="n">concat</span> <span class="o">=</span> <span class="nb">table.concat</span> </span><span id="L-4"><a href="#L-4"><span class="linenos" data-line="4"></span></a><span class="kd">local</span> <span class="n">deepcopy</span> <span class="c1">-- Assigned when needed.</span> </span><span id="L-5"><a href="#L-5"><span class="linenos" data-line="5"></span></a><span class="kd">local</span> <span class="nb">getmetatable</span> <span class="o">=</span> <span class="nb">getmetatable</span> </span><span id="L-6"><a href="#L-6"><span class="linenos" data-line="6"></span></a><span class="kd">local</span> <span class="n">insert</span> <span class="o">=</span> <span class="nb">table.insert</span> </span><span id="L-7"><a href="#L-7"><span class="linenos" data-line="7"></span></a><span class="kd">local</span> <span class="nb">next</span> <span class="o">=</span> <span class="nb">next</span> </span><span id="L-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="nb">rawget</span> <span class="o">=</span> <span class="nb">rawget</span> </span><span id="L-9"><a href="#L-9"><span class="linenos" data-line="9"></span></a><span class="kd">local</span> <span class="nb">rawset</span> <span class="o">=</span> <span class="nb">rawset</span> </span><span id="L-10"><a href="#L-10"><span class="linenos" data-line="10"></span></a><span class="kd">local</span> <span class="n">remove</span> <span class="o">=</span> <span class="nb">table.remove</span> </span><span id="L-11"><a href="#L-11"><span class="linenos" data-line="11"></span></a><span class="kd">local</span> <span class="nb">setmetatable</span> <span class="o">=</span> <span class="nb">setmetatable</span> </span><span id="L-12"><a href="#L-12"><span class="linenos" data-line="12"></span></a><span class="kd">local</span> <span class="nb">type</span> <span class="o">=</span> <span class="nb">type</span> </span><span id="L-13"><a href="#L-13"><span class="linenos" data-line="13"></span></a><span class="kd">local</span> <span class="n">unpack</span> <span class="o">=</span> <span class="n">unpack</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></span></a> </span><span id="L-15"><a href="#L-15"><span class="linenos" data-line="15"></span></a><span class="kd">local</span> <span class="n">classes</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-16"><a href="#L-16"><span class="linenos" data-line="16"></span></a><span class="kd">local</span> <span class="n">metamethods</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">loadData</span><span class="p">(</span><span class="s2">"Module:data/metamethods"</span><span class="p">)</span> </span><span id="L-17"><a href="#L-17"><span class="linenos" data-line="17"></span></a> </span><span id="L-18"><a href="#L-18"><span class="linenos" data-line="18"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-19"><a href="#L-19"><span class="linenos" data-line="19"></span></a><span class="c1">--</span> </span><span id="L-20"><a href="#L-20"><span class="linenos" data-line="20"></span></a><span class="c1">-- Helper functions</span> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a><span class="c1">--</span> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_nested</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a> <span class="kr">if</span> <span class="n">t</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-26"><a href="#L-26"><span class="linenos" data-line="26"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a> <span class="kr">elseif</span> <span class="p">...</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-28"><a href="#L-28"><span class="linenos" data-line="28"></span></a> <span class="kr">return</span> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-29"><a href="#L-29"><span class="linenos" data-line="29"></span></a> <span class="kr">end</span> </span><span id="L-30"><a href="#L-30"><span class="linenos" data-line="30"></span></a> <span class="kr">return</span> <span class="n">get_nested</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="p">...)</span> </span><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></span></a><span class="kr">end</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">set_nested</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a> <span class="kr">if</span> <span class="p">...</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-35"><a href="#L-35"><span class="linenos" data-line="35"></span></a> <span class="kd">local</span> <span class="n">t_next</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-36"><a href="#L-36"><span class="linenos" data-line="36"></span></a> <span class="kr">if</span> <span class="n">t_next</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a> <span class="n">t_next</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">t_next</span> </span><span id="L-39"><a href="#L-39"><span class="linenos" data-line="39"></span></a> <span class="kr">end</span> </span><span id="L-40"><a href="#L-40"><span class="linenos" data-line="40"></span></a> <span class="kr">return</span> <span class="n">set_nested</span><span class="p">(</span><span class="n">t_next</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></span></a> <span class="kr">end</span> </span><span id="L-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></span></a><span class="kr">end</span> </span><span id="L-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">inherit_metamethods</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span> </span><span id="L-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a> <span class="kr">if</span> <span class="n">parent</span> <span class="kr">then</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a> <span class="kr">for</span> <span class="n">method</span><span class="p">,</span> <span class="n">value</span> <span class="kr">in</span> <span class="nb">next</span><span class="p">,</span> <span class="n">parent</span> <span class="kr">do</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a> <span class="kr">if</span> <span class="n">child</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">metamethods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a> <span class="n">child</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> </span><span id="L-50"><a href="#L-50"><span class="linenos" data-line="50"></span></a> <span class="kr">end</span> </span><span id="L-51"><a href="#L-51"><span class="linenos" data-line="51"></span></a> <span class="kr">end</span> </span><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></span></a> <span class="kr">end</span> </span><span id="L-53"><a href="#L-53"><span class="linenos" data-line="53"></span></a> <span class="kr">return</span> <span class="n">child</span> </span><span id="L-54"><a href="#L-54"><span class="linenos" data-line="54"></span></a><span class="kr">end</span> </span><span id="L-55"><a href="#L-55"><span class="linenos" data-line="55"></span></a> </span><span id="L-56"><a href="#L-56"><span class="linenos" data-line="56"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">signed_index</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-57"><a href="#L-57"><span class="linenos" data-line="57"></span></a> <span class="kr">return</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">n</span> <span class="o"><=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="o">#</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">n</span> <span class="ow">or</span> <span class="n">n</span> </span><span id="L-58"><a href="#L-58"><span class="linenos" data-line="58"></span></a><span class="kr">end</span> </span><span id="L-59"><a href="#L-59"><span class="linenos" data-line="59"></span></a> </span><span id="L-60"><a href="#L-60"><span class="linenos" data-line="60"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_node</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-61"><a href="#L-61"><span class="linenos" data-line="61"></span></a> <span class="kr">return</span> <span class="n">classes</span><span class="p">[</span><span class="nb">getmetatable</span><span class="p">(</span><span class="n">value</span><span class="p">)]</span> <span class="o">~=</span> <span class="kc">nil</span> </span><span id="L-62"><a href="#L-62"><span class="linenos" data-line="62"></span></a><span class="kr">end</span> </span><span id="L-63"><a href="#L-63"><span class="linenos" data-line="63"></span></a> </span><span id="L-64"><a href="#L-64"><span class="linenos" data-line="64"></span></a><span class="c1">-- Recursively calling tostring() adds to the C stack (limit: 200), whereas</span> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></span></a><span class="c1">-- calling __tostring metamethods directly does not. Occasionally relevant when</span> </span><span id="L-66"><a href="#L-66"><span class="linenos" data-line="66"></span></a><span class="c1">-- dealing with very deep nesting.</span> </span><span id="L-67"><a href="#L-67"><span class="linenos" data-line="67"></span></a><span class="kd">local</span> <span class="nb">tostring</span> </span><span id="L-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a><span class="kr">do</span> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></span></a> <span class="kd">local</span> <span class="n">_tostring</span> <span class="o">=</span> <span class="n">_G</span><span class="p">.</span><span class="n">tostring</span> </span><span id="L-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a> <span class="kr">function</span> <span class="nf">tostring</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-72"><a href="#L-72"><span class="linenos" data-line="72"></span></a> <span class="kr">if</span> <span class="n">is_node</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a> <span class="kr">return</span> <span class="n">value</span><span class="p">:</span><span class="n">__tostring</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-74"><a href="#L-74"><span class="linenos" data-line="74"></span></a> <span class="kr">end</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a> <span class="kr">return</span> <span class="n">_tostring</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a> <span class="kr">end</span> </span><span id="L-77"><a href="#L-77"><span class="linenos" data-line="77"></span></a><span class="kr">end</span> </span><span id="L-78"><a href="#L-78"><span class="linenos" data-line="78"></span></a> </span><span id="L-79"><a href="#L-79"><span class="linenos" data-line="79"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">class_else_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a> <span class="kd">local</span> <span class="n">class</span> <span class="o">=</span> <span class="n">classes</span><span class="p">[</span><span class="nb">getmetatable</span><span class="p">(</span><span class="n">value</span><span class="p">)]</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a> <span class="kr">if</span> <span class="n">class</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a> <span class="kr">return</span> <span class="n">class</span> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a> <span class="kr">end</span> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></span></a> <span class="kr">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a><span class="kr">end</span> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></span></a> </span><span id="L-87"><a href="#L-87"><span class="linenos" data-line="87"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-88"><a href="#L-88"><span class="linenos" data-line="88"></span></a><span class="c1">--</span> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a><span class="c1">-- Nodes</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a><span class="c1">--</span> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a><span class="kd">local</span> <span class="n">Node</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a><span class="n">Node</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Node</span> </span><span id="L-95"><a href="#L-95"><span class="linenos" data-line="95"></span></a> </span><span id="L-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">next</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-97"><a href="#L-97"><span class="linenos" data-line="97"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-98"><a href="#L-98"><span class="linenos" data-line="98"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">self</span><span class="p">,</span> <span class="n">i</span> </span><span id="L-99"><a href="#L-99"><span class="linenos" data-line="99"></span></a><span class="kr">end</span> </span><span id="L-100"><a href="#L-100"><span class="linenos" data-line="100"></span></a> </span><span id="L-101"><a href="#L-101"><span class="linenos" data-line="101"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">next_node</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a> <span class="kd">local</span> <span class="n">v</span> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></span></a> <span class="kr">repeat</span> </span><span id="L-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a> <span class="n">v</span><span class="p">,</span> <span class="n">self</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="nb">next</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></span></a> <span class="kr">until</span> <span class="n">v</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">is_node</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> </span><span id="L-106"><a href="#L-106"><span class="linenos" data-line="106"></span></a> <span class="kr">return</span> <span class="n">v</span><span class="p">,</span> <span class="n">self</span><span class="p">,</span> <span class="n">i</span> </span><span id="L-107"><a href="#L-107"><span class="linenos" data-line="107"></span></a><span class="kr">end</span> </span><span id="L-108"><a href="#L-108"><span class="linenos" data-line="108"></span></a> </span><span id="L-109"><a href="#L-109"><span class="linenos" data-line="109"></span></a><span class="c1">-- Implements recursive iteration over a node tree, using functors to maintain state (which uses a lot less memory than closures). Iterator1 exists only to return the calling node on the first iteration, while Iterator2 uses a stack to store the state of each layer in the tree.</span> </span><span id="L-110"><a href="#L-110"><span class="linenos" data-line="110"></span></a> </span><span id="L-111"><a href="#L-111"><span class="linenos" data-line="111"></span></a><span class="c1">-- When a node is encountered (which may contain other nodes), it is returned on the first iteration, and then any child nodes are returned on each subsequent iteration; the same process is followed if any of those children contain nodes themselves. Once a particular node has been fully traversed, the iterator moves back up one layer and continues with any sibling nodes.</span> </span><span id="L-112"><a href="#L-112"><span class="linenos" data-line="112"></span></a> </span><span id="L-113"><a href="#L-113"><span class="linenos" data-line="113"></span></a><span class="c1">-- Each iteration returns three values: `value`, `node` and `key`. Together, these can be used to manipulate the node tree at any given point without needing to know the full structure. Note that when the input node is returned on the first iteration, `node` and `key` will be nil.</span> </span><span id="L-114"><a href="#L-114"><span class="linenos" data-line="114"></span></a> </span><span id="L-115"><a href="#L-115"><span class="linenos" data-line="115"></span></a><span class="c1">-- By default, the iterator will use the `next` method of each node, but this can be changed with the `next_func` parameter, which accepts a string argument with the name of a next method. This is because trees might consist of several different classes of node, and each might have different next methods that are tailored to their particular structures. In addition, each class of node might have multiple different next methods, which can be named according to their purposes. `next_func` ensures that the iterator uses equivalent next methods between different types of node.</span> </span><span id="L-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a><span class="c1">-- Currently, two next methods are available: `next`, which simply iterates over the node conventionally, and `next_node`, which only returns children that are themselves nodes. Custom next methods can be declared by any calling module.</span> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></span></a><span class="kr">do</span> </span><span id="L-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a> <span class="kd">local</span> <span class="n">Iterator1</span><span class="p">,</span> <span class="n">Iterator2</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">{}</span> </span><span id="L-120"><a href="#L-120"><span class="linenos" data-line="120"></span></a> <span class="n">Iterator1</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Iterator2</span> <span class="c1">-- Not a typo.</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a> <span class="n">Iterator2</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Iterator2</span> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></span></a> <span class="kr">function</span> <span class="nc">Iterator1</span><span class="p">:</span><span class="nf">__call</span><span class="p">()</span> </span><span id="L-124"><a href="#L-124"><span class="linenos" data-line="124"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">Iterator2</span><span class="p">)</span> </span><span id="L-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">node</span> </span><span id="L-126"><a href="#L-126"><span class="linenos" data-line="126"></span></a> <span class="kr">end</span> </span><span id="L-127"><a href="#L-127"><span class="linenos" data-line="127"></span></a> </span><span id="L-128"><a href="#L-128"><span class="linenos" data-line="128"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">push</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> </span><span id="L-129"><a href="#L-129"><span class="linenos" data-line="129"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></span></a> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-131"><a href="#L-131"><span class="linenos" data-line="131"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="n">node</span> </span><span id="L-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a> <span class="p">}</span> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a> <span class="kr">return</span> <span class="n">self</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></span></a> <span class="kr">end</span> </span><span id="L-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">pop</span><span class="p">()</span> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> </span><span id="L-142"><a href="#L-142"><span class="linenos" data-line="142"></span></a> <span class="kr">end</span> </span><span id="L-143"><a href="#L-143"><span class="linenos" data-line="143"></span></a> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">iterate</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-145"><a href="#L-145"><span class="linenos" data-line="145"></span></a> <span class="kd">local</span> <span class="n">v</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="p">...</span> </span><span id="L-146"><a href="#L-146"><span class="linenos" data-line="146"></span></a> <span class="kr">if</span> <span class="n">v</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">k</span> <span class="o">=</span> <span class="n">k</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a> <span class="kr">return</span> <span class="p">...</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a> <span class="kr">end</span> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-151"><a href="#L-151"><span class="linenos" data-line="151"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">node</span> </span><span id="L-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">iterate</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">next_func</span><span class="p">](</span><span class="n">node</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">k</span><span class="p">))</span> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a> <span class="kr">end</span> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></span></a> <span class="kr">end</span> </span><span id="L-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">__call</span><span class="p">()</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a> <span class="kd">local</span> <span class="n">node</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">node</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">k</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a> <span class="kd">local</span> <span class="n">curr_val</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a> <span class="kr">if</span> <span class="n">is_node</span><span class="p">(</span><span class="n">curr_val</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push</span><span class="p">(</span><span class="n">curr_val</span><span class="p">)</span> </span><span id="L-164"><a href="#L-164"><span class="linenos" data-line="164"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-165"><a href="#L-165"><span class="linenos" data-line="165"></span></a> <span class="n">node</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">node</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">k</span> </span><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a> <span class="kr">end</span> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">iterate</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">next_func</span><span class="p">](</span><span class="n">node</span><span class="p">,</span> <span class="n">k</span><span class="p">))</span> </span><span id="L-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a> <span class="kr">end</span> </span><span id="L-169"><a href="#L-169"><span class="linenos" data-line="169"></span></a> </span><span id="L-170"><a href="#L-170"><span class="linenos" data-line="170"></span></a> <span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">__pairs</span><span class="p">(</span><span class="n">next_func</span><span class="p">)</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-172"><a href="#L-172"><span class="linenos" data-line="172"></span></a> <span class="n">next_func</span> <span class="o">=</span> <span class="n">next_func</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="s2">"next"</span> <span class="ow">or</span> <span class="n">next_func</span> </span><span id="L-173"><a href="#L-173"><span class="linenos" data-line="173"></span></a> <span class="p">},</span> <span class="n">Iterator1</span><span class="p">):</span><span class="n">push</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-174"><a href="#L-174"><span class="linenos" data-line="174"></span></a> <span class="kr">end</span> </span><span id="L-175"><a href="#L-175"><span class="linenos" data-line="175"></span></a><span class="kr">end</span> </span><span id="L-176"><a href="#L-176"><span class="linenos" data-line="176"></span></a> </span><span id="L-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">rawpairs</span><span class="p">()</span> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></span></a> <span class="kr">return</span> <span class="nb">next</span><span class="p">,</span> <span class="n">self</span> </span><span id="L-179"><a href="#L-179"><span class="linenos" data-line="179"></span></a><span class="kr">end</span> </span><span id="L-180"><a href="#L-180"><span class="linenos" data-line="180"></span></a> </span><span id="L-181"><a href="#L-181"><span class="linenos" data-line="181"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-182"><a href="#L-182"><span class="linenos" data-line="182"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-183"><a href="#L-183"><span class="linenos" data-line="183"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-184"><a href="#L-184"><span class="linenos" data-line="184"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span> </span><span id="L-185"><a href="#L-185"><span class="linenos" data-line="185"></span></a> <span class="kr">end</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a><span class="kr">end</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></span></a> </span><span id="L-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">clone</span><span class="p">()</span> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">deepcopy</span> <span class="kr">then</span> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a> <span class="n">deepcopy</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"Module:table"</span><span class="p">).</span><span class="n">deepcopy</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a> <span class="kr">end</span> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></span></a> <span class="kr">return</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s2">"keep"</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></span></a><span class="kr">end</span> </span><span id="L-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a> </span><span id="L-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new_class</span><span class="p">(</span><span class="n">class</span><span class="p">)</span> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="p">{</span><span class="nb">type</span> <span class="o">=</span> <span class="n">class</span><span class="p">}</span> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-199"><a href="#L-199"><span class="linenos" data-line="199"></span></a> <span class="n">t</span> <span class="o">=</span> <span class="n">inherit_metamethods</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a> <span class="n">classes</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">class</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-202"><a href="#L-202"><span class="linenos" data-line="202"></span></a><span class="kr">end</span> </span><span id="L-203"><a href="#L-203"><span class="linenos" data-line="203"></span></a> </span><span id="L-204"><a href="#L-204"><span class="linenos" data-line="204"></span></a><span class="n">Node</span><span class="p">.</span><span class="n">keys_to_remove</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"fail"</span><span class="p">,</span> <span class="s2">"handler"</span><span class="p">,</span> <span class="s2">"head"</span><span class="p">,</span> <span class="s2">"override"</span><span class="p">,</span> <span class="s2">"route"</span><span class="p">}</span> </span><span id="L-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a> </span><span id="L-206"><a href="#L-206"><span class="linenos" data-line="206"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> </span><span id="L-207"><a href="#L-207"><span class="linenos" data-line="207"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a> <span class="kd">local</span> <span class="n">keys_to_remove</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">keys_to_remove</span> </span><span id="L-209"><a href="#L-209"><span class="linenos" data-line="209"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">keys_to_remove</span> <span class="kr">do</span> </span><span id="L-210"><a href="#L-210"><span class="linenos" data-line="210"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">keys_to_remove</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-211"><a href="#L-211"><span class="linenos" data-line="211"></span></a> <span class="kr">end</span> </span><span id="L-212"><a href="#L-212"><span class="linenos" data-line="212"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-213"><a href="#L-213"><span class="linenos" data-line="213"></span></a><span class="kr">end</span> </span><span id="L-214"><a href="#L-214"><span class="linenos" data-line="214"></span></a> </span><span id="L-215"><a href="#L-215"><span class="linenos" data-line="215"></span></a><span class="kr">do</span> </span><span id="L-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a> <span class="kd">local</span> <span class="n">Proxy</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-217"><a href="#L-217"><span class="linenos" data-line="217"></span></a> </span><span id="L-218"><a href="#L-218"><span class="linenos" data-line="218"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">__index</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></span></a> <span class="kd">local</span> <span class="n">v</span> <span class="o">=</span> <span class="n">Proxy</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-220"><a href="#L-220"><span class="linenos" data-line="220"></span></a> <span class="kr">if</span> <span class="n">v</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-221"><a href="#L-221"><span class="linenos" data-line="221"></span></a> <span class="kr">return</span> <span class="n">v</span> </span><span id="L-222"><a href="#L-222"><span class="linenos" data-line="222"></span></a> <span class="kr">end</span> </span><span id="L-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-224"><a href="#L-224"><span class="linenos" data-line="224"></span></a> <span class="kr">end</span> </span><span id="L-225"><a href="#L-225"><span class="linenos" data-line="225"></span></a> </span><span id="L-226"><a href="#L-226"><span class="linenos" data-line="226"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">__newindex</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a> <span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="kr">then</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__parents</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="kc">false</span> <span class="kr">then</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Character is immutable."</span><span class="p">)</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a> <span class="kr">else</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Invalid key."</span><span class="p">)</span> </span><span id="L-235"><a href="#L-235"><span class="linenos" data-line="235"></span></a> <span class="kr">end</span> </span><span id="L-236"><a href="#L-236"><span class="linenos" data-line="236"></span></a> <span class="kr">end</span> </span><span id="L-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a> </span><span id="L-238"><a href="#L-238"><span class="linenos" data-line="238"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">build</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> </span><span id="L-239"><a href="#L-239"><span class="linenos" data-line="239"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__len</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-240"><a href="#L-240"><span class="linenos" data-line="240"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span> </span><span id="L-241"><a href="#L-241"><span class="linenos" data-line="241"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__parents</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__len</span> <span class="o">=</span> <span class="n">len</span> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></span></a> <span class="kr">end</span> </span><span id="L-245"><a href="#L-245"><span class="linenos" data-line="245"></span></a> </span><span id="L-246"><a href="#L-246"><span class="linenos" data-line="246"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">iter</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a> <span class="kd">local</span> <span class="n">char</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a> <span class="kr">if</span> <span class="n">char</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></span></a> <span class="kr">return</span> <span class="n">i</span><span class="p">,</span> <span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">self</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">__parents</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">self</span><span class="p">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> </span><span id="L-251"><a href="#L-251"><span class="linenos" data-line="251"></span></a> <span class="kr">end</span> </span><span id="L-252"><a href="#L-252"><span class="linenos" data-line="252"></span></a> <span class="kr">end</span> </span><span id="L-253"><a href="#L-253"><span class="linenos" data-line="253"></span></a> </span><span id="L-254"><a href="#L-254"><span class="linenos" data-line="254"></span></a> <span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new_proxy</span><span class="p">()</span> </span><span id="L-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></span></a> <span class="n">__node</span> <span class="o">=</span> <span class="n">self</span><span class="p">,</span> </span><span id="L-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a> <span class="n">__chars</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></span></a> <span class="n">__parents</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a> <span class="n">__keys</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a> <span class="n">__len</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></span></a> <span class="p">},</span> <span class="n">Proxy</span><span class="p">)</span> </span><span id="L-262"><a href="#L-262"><span class="linenos" data-line="262"></span></a> <span class="kr">end</span> </span><span id="L-263"><a href="#L-263"><span class="linenos" data-line="263"></span></a><span class="kr">end</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></span></a> </span><span id="L-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></span></a><span class="c1">--</span> </span><span id="L-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a><span class="c1">-- Parser</span> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></span></a><span class="c1">--</span> </span><span id="L-269"><a href="#L-269"><span class="linenos" data-line="269"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></span></a> </span><span id="L-271"><a href="#L-271"><span class="linenos" data-line="271"></span></a><span class="kd">local</span> <span class="n">Parser</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a><span class="n">Parser</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Parser</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></span></a> </span><span id="L-274"><a href="#L-274"><span class="linenos" data-line="274"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">read</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> </span><span id="L-275"><a href="#L-275"><span class="linenos" data-line="275"></span></a> <span class="kd">local</span> <span class="n">v</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="p">(</span><span class="n">delta</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)]</span> </span><span id="L-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a> <span class="kr">return</span> <span class="n">v</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="s2">""</span> <span class="ow">or</span> <span class="n">v</span> </span><span id="L-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a><span class="kr">end</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></span></a> </span><span id="L-279"><a href="#L-279"><span class="linenos" data-line="279"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">advance</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-280"><a href="#L-280"><span class="linenos" data-line="280"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-281"><a href="#L-281"><span class="linenos" data-line="281"></span></a><span class="kr">end</span> </span><span id="L-282"><a href="#L-282"><span class="linenos" data-line="282"></span></a> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">layer</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> <span class="kr">return</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></span></a> <span class="kr">end</span> </span><span id="L-287"><a href="#L-287"><span class="linenos" data-line="287"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a><span class="kr">end</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></span></a> </span><span id="L-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emit</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-291"><a href="#L-291"><span class="linenos" data-line="291"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-293"><a href="#L-293"><span class="linenos" data-line="293"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> <span class="kr">else</span> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="o">#</span><span class="n">layer</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a> <span class="kr">end</span> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></span></a><span class="kr">end</span> </span><span id="L-298"><a href="#L-298"><span class="linenos" data-line="298"></span></a> </span><span id="L-299"><a href="#L-299"><span class="linenos" data-line="299"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emit_tokens</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">b</span> <span class="kr">do</span> </span><span id="L-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-305"><a href="#L-305"><span class="linenos" data-line="305"></span></a> <span class="kr">end</span> </span><span id="L-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a> <span class="kr">else</span> </span><span id="L-307"><a href="#L-307"><span class="linenos" data-line="307"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">a</span> <span class="kr">do</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="n">len</span> <span class="o">=</span> <span class="n">len</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">len</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-311"><a href="#L-311"><span class="linenos" data-line="311"></span></a> <span class="kr">end</span> </span><span id="L-312"><a href="#L-312"><span class="linenos" data-line="312"></span></a> <span class="kr">end</span> </span><span id="L-313"><a href="#L-313"><span class="linenos" data-line="313"></span></a><span class="kr">end</span> </span><span id="L-314"><a href="#L-314"><span class="linenos" data-line="314"></span></a> </span><span id="L-315"><a href="#L-315"><span class="linenos" data-line="315"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">remove</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-318"><a href="#L-318"><span class="linenos" data-line="318"></span></a> <span class="kr">return</span> <span class="n">remove</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> </span><span id="L-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a> <span class="kr">end</span> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-321"><a href="#L-321"><span class="linenos" data-line="321"></span></a> <span class="kd">local</span> <span class="n">token</span> <span class="o">=</span> <span class="n">layer</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a> <span class="n">layer</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> <span class="kr">return</span> <span class="n">token</span> </span><span id="L-324"><a href="#L-324"><span class="linenos" data-line="324"></span></a><span class="kr">end</span> </span><span id="L-325"><a href="#L-325"><span class="linenos" data-line="325"></span></a> </span><span id="L-326"><a href="#L-326"><span class="linenos" data-line="326"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">replace</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-327"><a href="#L-327"><span class="linenos" data-line="327"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-328"><a href="#L-328"><span class="linenos" data-line="328"></span></a> <span class="n">layer</span><span class="p">[</span><span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">)]</span> <span class="o">=</span> <span class="n">b</span> </span><span id="L-329"><a href="#L-329"><span class="linenos" data-line="329"></span></a><span class="kr">end</span> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></span></a> </span><span id="L-331"><a href="#L-331"><span class="linenos" data-line="331"></span></a><span class="c1">-- Unlike default table.concat, this respects __tostring metamethods.</span> </span><span id="L-332"><a href="#L-332"><span class="linenos" data-line="332"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">concat</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> </span><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></span></a> <span class="kr">if</span> <span class="n">a</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">a</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-334"><a href="#L-334"><span class="linenos" data-line="334"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">concat</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-335"><a href="#L-335"><span class="linenos" data-line="335"></span></a> <span class="kr">end</span> </span><span id="L-336"><a href="#L-336"><span class="linenos" data-line="336"></span></a> <span class="kd">local</span> <span class="n">layer</span><span class="p">,</span> <span class="n">ret</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">layer</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="p">{},</span> <span class="mi">0</span> </span><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="n">b</span> <span class="ow">and</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">,</span> <span class="n">c</span> <span class="ow">and</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="ow">or</span> <span class="o">#</span><span class="n">layer</span> <span class="kr">do</span> </span><span id="L-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></span></a> <span class="n">ret</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">layer</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> <span class="kr">end</span> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a><span class="kr">end</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></span></a> </span><span id="L-344"><a href="#L-344"><span class="linenos" data-line="344"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emitted</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> </span><span id="L-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a> <span class="kr">if</span> <span class="n">delta</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-346"><a href="#L-346"><span class="linenos" data-line="346"></span></a> <span class="n">delta</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> </span><span id="L-347"><a href="#L-347"><span class="linenos" data-line="347"></span></a> <span class="kr">end</span> </span><span id="L-348"><a href="#L-348"><span class="linenos" data-line="348"></span></a> <span class="kd">local</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-349"><a href="#L-349"><span class="linenos" data-line="349"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-350"><a href="#L-350"><span class="linenos" data-line="350"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">layer</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-353"><a href="#L-353"><span class="linenos" data-line="353"></span></a> <span class="kr">end</span> </span><span id="L-354"><a href="#L-354"><span class="linenos" data-line="354"></span></a> <span class="kd">local</span> <span class="n">layer_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a> <span class="kr">if</span> <span class="o">-</span><span class="n">delta</span> <span class="o"><=</span> <span class="n">layer_len</span> <span class="kr">then</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></span></a> <span class="kr">return</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">layer_len</span> <span class="o">+</span> <span class="n">delta</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-357"><a href="#L-357"><span class="linenos" data-line="357"></span></a> <span class="kr">end</span> </span><span id="L-358"><a href="#L-358"><span class="linenos" data-line="358"></span></a> <span class="n">delta</span> <span class="o">=</span> <span class="n">delta</span> <span class="o">+</span> <span class="n">layer_len</span> </span><span id="L-359"><a href="#L-359"><span class="linenos" data-line="359"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-360"><a href="#L-360"><span class="linenos" data-line="360"></span></a> <span class="kr">end</span> </span><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a><span class="kr">end</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">push</span><span class="p">(</span><span class="n">route</span><span class="p">)</span> </span><span id="L-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span><span class="p">,</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a> <span class="n">route</span> <span class="o">=</span> <span class="n">route</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></span></a> <span class="p">}</span> </span><span id="L-368"><a href="#L-368"><span class="linenos" data-line="368"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-369"><a href="#L-369"><span class="linenos" data-line="369"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-370"><a href="#L-370"><span class="linenos" data-line="370"></span></a><span class="kr">end</span> </span><span id="L-371"><a href="#L-371"><span class="linenos" data-line="371"></span></a> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">push_sublayer</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="n">inherit</span><span class="p">)</span> </span><span id="L-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a> <span class="kd">local</span> <span class="n">sublayer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></span></a> <span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span><span class="p">,</span> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></span></a> <span class="n">sublayer</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> <span class="p">}</span> </span><span id="L-377"><a href="#L-377"><span class="linenos" data-line="377"></span></a> <span class="kr">if</span> <span class="n">inherit</span> <span class="kr">then</span> </span><span id="L-378"><a href="#L-378"><span class="linenos" data-line="378"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">sublayer</span><span class="p">,</span> <span class="n">inherit_metamethods</span><span class="p">({</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="n">layer</span><span class="p">,</span> </span><span id="L-381"><a href="#L-381"><span class="linenos" data-line="381"></span></a> <span class="n">__newindex</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></span></a> <span class="p">},</span> <span class="nb">getmetatable</span><span class="p">(</span><span class="n">layer</span><span class="p">)))</span> </span><span id="L-383"><a href="#L-383"><span class="linenos" data-line="383"></span></a> <span class="kr">end</span> </span><span id="L-384"><a href="#L-384"><span class="linenos" data-line="384"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">sublayer</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">sublayer</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a><span class="kr">end</span> </span><span id="L-387"><a href="#L-387"><span class="linenos" data-line="387"></span></a> </span><span id="L-388"><a href="#L-388"><span class="linenos" data-line="388"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">pop</span><span class="p">()</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a> <span class="kd">local</span> <span class="n">len</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-392"><a href="#L-392"><span class="linenos" data-line="392"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-393"><a href="#L-393"><span class="linenos" data-line="393"></span></a> <span class="n">len</span> <span class="o">=</span> <span class="n">len</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-394"><a href="#L-394"><span class="linenos" data-line="394"></span></a> <span class="kd">local</span> <span class="n">new</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">self</span> <span class="ow">or</span> <span class="n">new</span> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></span></a> <span class="kr">if</span> <span class="n">layer</span><span class="p">.</span><span class="n">sublayer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-397"><a href="#L-397"><span class="linenos" data-line="397"></span></a> <span class="kr">break</span> </span><span id="L-398"><a href="#L-398"><span class="linenos" data-line="398"></span></a> <span class="kr">end</span> </span><span id="L-399"><a href="#L-399"><span class="linenos" data-line="399"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit_tokens</span><span class="p">(</span><span class="n">layer</span><span class="p">)</span> </span><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></span></a> <span class="kr">end</span> </span><span id="L-401"><a href="#L-401"><span class="linenos" data-line="401"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-402"><a href="#L-402"><span class="linenos" data-line="402"></span></a><span class="kr">end</span> </span><span id="L-403"><a href="#L-403"><span class="linenos" data-line="403"></span></a> </span><span id="L-404"><a href="#L-404"><span class="linenos" data-line="404"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">pop_sublayer</span><span class="p">()</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="kd">local</span> <span class="n">len</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span><span class="p">,</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="kd">local</span> <span class="n">new</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">self</span> <span class="ow">or</span> <span class="n">new</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">sublayer</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-412"><a href="#L-412"><span class="linenos" data-line="412"></span></a><span class="kr">end</span> </span><span id="L-413"><a href="#L-413"><span class="linenos" data-line="413"></span></a> </span><span id="L-414"><a href="#L-414"><span class="linenos" data-line="414"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">get</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push</span><span class="p">(</span><span class="n">route</span><span class="p">)</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">route</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">traverse</span><span class="p">()</span> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></span></a> <span class="kr">end</span> </span><span id="L-420"><a href="#L-420"><span class="linenos" data-line="420"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-421"><a href="#L-421"><span class="linenos" data-line="421"></span></a><span class="kr">end</span> </span><span id="L-422"><a href="#L-422"><span class="linenos" data-line="422"></span></a> </span><span id="L-423"><a href="#L-423"><span class="linenos" data-line="423"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">try</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-424"><a href="#L-424"><span class="linenos" data-line="424"></span></a> <span class="kd">local</span> <span class="n">failed_layer</span> <span class="o">=</span> <span class="n">get_nested</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">failed_routes</span><span class="p">,</span> <span class="n">route</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span><span class="p">)</span> </span><span id="L-425"><a href="#L-425"><span class="linenos" data-line="425"></span></a> <span class="kr">if</span> <span class="n">failed_layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-426"><a href="#L-426"><span class="linenos" data-line="426"></span></a> <span class="kr">return</span> <span class="kc">false</span><span class="p">,</span> <span class="n">failed_layer</span> </span><span id="L-427"><a href="#L-427"><span class="linenos" data-line="427"></span></a> <span class="kr">end</span> </span><span id="L-428"><a href="#L-428"><span class="linenos" data-line="428"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">get</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-429"><a href="#L-429"><span class="linenos" data-line="429"></span></a> <span class="kr">return</span> <span class="ow">not</span> <span class="n">layer</span><span class="p">.</span><span class="n">fail</span><span class="p">,</span> <span class="n">layer</span> </span><span id="L-430"><a href="#L-430"><span class="linenos" data-line="430"></span></a><span class="kr">end</span> </span><span id="L-431"><a href="#L-431"><span class="linenos" data-line="431"></span></a> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">consume</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-434"><a href="#L-434"><span class="linenos" data-line="434"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">()</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></span></a> <span class="kr">end</span> </span><span id="L-437"><a href="#L-437"><span class="linenos" data-line="437"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">layer</span><span class="p">.</span><span class="n">override</span> <span class="ow">or</span> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span><span class="p">)(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-438"><a href="#L-438"><span class="linenos" data-line="438"></span></a><span class="kr">end</span> </span><span id="L-439"><a href="#L-439"><span class="linenos" data-line="439"></span></a> </span><span id="L-440"><a href="#L-440"><span class="linenos" data-line="440"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">fail_route</span><span class="p">()</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">fail</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="n">set_nested</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s2">"failed_routes"</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">route</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">head</span><span class="p">,</span> <span class="n">layer</span><span class="p">)</span> </span><span id="L-444"><a href="#L-444"><span class="linenos" data-line="444"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">head</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-446"><a href="#L-446"><span class="linenos" data-line="446"></span></a><span class="kr">end</span> </span><span id="L-447"><a href="#L-447"><span class="linenos" data-line="447"></span></a> </span><span id="L-448"><a href="#L-448"><span class="linenos" data-line="448"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">traverse</span><span class="p">()</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-450"><a href="#L-450"><span class="linenos" data-line="450"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-451"><a href="#L-451"><span class="linenos" data-line="451"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></span></a> <span class="kr">end</span> </span><span id="L-454"><a href="#L-454"><span class="linenos" data-line="454"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></span></a> <span class="kr">end</span> </span><span id="L-456"><a href="#L-456"><span class="linenos" data-line="456"></span></a><span class="kr">end</span> </span><span id="L-457"><a href="#L-457"><span class="linenos" data-line="457"></span></a> </span><span id="L-458"><a href="#L-458"><span class="linenos" data-line="458"></span></a><span class="c1">-- Converts a handler into a switch table the first time it's called, which avoids creating unnecessary objects, and prevents any scoping issues caused by parser methods being assigned to table keys before they've been declared.</span> </span><span id="L-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a><span class="c1">-- false is used as the default key.</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a><span class="kr">do</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a> <span class="kd">local</span> <span class="n">Switch</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-462"><a href="#L-462"><span class="linenos" data-line="462"></span></a> </span><span id="L-463"><a href="#L-463"><span class="linenos" data-line="463"></span></a> <span class="kr">function</span> <span class="nc">Switch</span><span class="p">:</span><span class="nf">__call</span><span class="p">(</span><span class="n">parser</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-464"><a href="#L-464"><span class="linenos" data-line="464"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">this</span><span class="p">]</span> <span class="ow">or</span> <span class="n">self</span><span class="p">[</span><span class="kc">false</span><span class="p">])(</span><span class="n">parser</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></span></a> <span class="kr">end</span> </span><span id="L-466"><a href="#L-466"><span class="linenos" data-line="466"></span></a> </span><span id="L-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">switch</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></span></a> <span class="c1">-- Point handler to the new switch table if the calling function is the current handler.</span> </span><span id="L-470"><a href="#L-470"><span class="linenos" data-line="470"></span></a> <span class="kr">if</span> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">==</span> <span class="n">func</span> <span class="kr">then</span> </span><span id="L-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> <span class="kr">end</span> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Switch</span><span class="p">)</span> </span><span id="L-474"><a href="#L-474"><span class="linenos" data-line="474"></span></a> <span class="kr">end</span> </span><span id="L-475"><a href="#L-475"><span class="linenos" data-line="475"></span></a><span class="kr">end</span> </span><span id="L-476"><a href="#L-476"><span class="linenos" data-line="476"></span></a> </span><span id="L-477"><a href="#L-477"><span class="linenos" data-line="477"></span></a><span class="c1">-- Generate a new parser class object, which is used as the template for any parser objects. These should be customized with additional/modified methods as needed.</span> </span><span id="L-478"><a href="#L-478"><span class="linenos" data-line="478"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">new_class</span><span class="p">()</span> </span><span id="L-479"><a href="#L-479"><span class="linenos" data-line="479"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-480"><a href="#L-480"><span class="linenos" data-line="480"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-481"><a href="#L-481"><span class="linenos" data-line="481"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">inherit_metamethods</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">),</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-482"><a href="#L-482"><span class="linenos" data-line="482"></span></a><span class="kr">end</span> </span><span id="L-483"><a href="#L-483"><span class="linenos" data-line="483"></span></a> </span><span id="L-484"><a href="#L-484"><span class="linenos" data-line="484"></span></a><span class="c1">-- Generate a new parser object, which is used for a specific parse.</span> </span><span id="L-485"><a href="#L-485"><span class="linenos" data-line="485"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-486"><a href="#L-486"><span class="linenos" data-line="486"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-487"><a href="#L-487"><span class="linenos" data-line="487"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">,</span> </span><span id="L-488"><a href="#L-488"><span class="linenos" data-line="488"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="mi">1</span> </span><span id="L-489"><a href="#L-489"><span class="linenos" data-line="489"></span></a> <span class="p">},</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-490"><a href="#L-490"><span class="linenos" data-line="490"></span></a><span class="kr">end</span> </span><span id="L-491"><a href="#L-491"><span class="linenos" data-line="491"></span></a> </span><span id="L-492"><a href="#L-492"><span class="linenos" data-line="492"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">parse</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span><span id="L-493"><a href="#L-493"><span class="linenos" data-line="493"></span></a> <span class="kd">local</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">text</span><span class="p">)</span> </span><span id="L-494"><a href="#L-494"><span class="linenos" data-line="494"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">tokens</span> <span class="o">=</span> <span class="n">parser</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">unpack</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">route</span><span class="p">))</span> </span><span id="L-495"><a href="#L-495"><span class="linenos" data-line="495"></span></a> <span class="kr">if</span> <span class="o">#</span><span class="n">parser</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-496"><a href="#L-496"><span class="linenos" data-line="496"></span></a> <span class="c1">-- This shouldn't happen.</span> </span><span id="L-497"><a href="#L-497"><span class="linenos" data-line="497"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Parser exited with non-empty stack."</span><span class="p">)</span> </span><span id="L-498"><a href="#L-498"><span class="linenos" data-line="498"></span></a> <span class="kr">elseif</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-499"><a href="#L-499"><span class="linenos" data-line="499"></span></a> <span class="kd">local</span> <span class="n">node</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">node</span> </span><span id="L-500"><a href="#L-500"><span class="linenos" data-line="500"></span></a> <span class="kr">return</span> <span class="kc">true</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span><span class="n">new</span><span class="p">(</span><span class="n">tokens</span><span class="p">,</span> <span class="n">unpack</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="mi">2</span><span class="p">)),</span> <span class="n">parser</span> </span><span id="L-501"><a href="#L-501"><span class="linenos" data-line="501"></span></a> <span class="kr">elseif</span> <span class="n">data</span><span class="p">.</span><span class="n">allow_fail</span> <span class="kr">then</span> </span><span id="L-502"><a href="#L-502"><span class="linenos" data-line="502"></span></a> <span class="kr">return</span> <span class="kc">false</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">parser</span> </span><span id="L-503"><a href="#L-503"><span class="linenos" data-line="503"></span></a> <span class="kr">end</span> </span><span id="L-504"><a href="#L-504"><span class="linenos" data-line="504"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Parser exited with failed route."</span><span class="p">)</span> </span><span id="L-505"><a href="#L-505"><span class="linenos" data-line="505"></span></a><span class="kr">end</span> </span><span id="L-506"><a href="#L-506"><span class="linenos" data-line="506"></span></a> </span><span id="L-507"><a href="#L-507"><span class="linenos" data-line="507"></span></a><span class="n">export</span><span class="p">.</span><span class="n">class_else_type</span> <span class="o">=</span> <span class="n">class_else_type</span> </span><span id="L-508"><a href="#L-508"><span class="linenos" data-line="508"></span></a><span class="n">export</span><span class="p">.</span><span class="n">is_node</span> <span class="o">=</span> <span class="n">is_node</span> </span><span id="L-509"><a href="#L-509"><span class="linenos" data-line="509"></span></a><span class="n">export</span><span class="p">.</span><span class="n">tostring</span> <span class="o">=</span> <span class="nb">tostring</span> </span><span id="L-510"><a href="#L-510"><span class="linenos" data-line="510"></span></a> </span><span id="L-511"><a href="#L-511"><span class="linenos" data-line="511"></span></a><span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span> </span><span id="L-512"><a href="#L-512"><span class="linenos" data-line="512"></span></a> <span class="kr">return</span> <span class="n">Parser</span><span class="p">:</span><span class="n">new_class</span><span class="p">(),</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">"node"</span><span class="p">)</span> </span><span id="L-513"><a href="#L-513"><span class="linenos" data-line="513"></span></a><span class="kr">end</span> </span><span id="L-514"><a href="#L-514"><span class="linenos" data-line="514"></span></a> </span><span id="L-515"><a href="#L-515"><span class="linenos" data-line="515"></span></a><span class="kr">return</span> <span class="n">export</span> </span></pre></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐694cf4987f‐wxgwh Cached time: 20241126005137 Cache expiry: 2592000 Reduced expiry: false Complications: [] CPU time usage: 0.054 seconds Real time usage: 0.066 seconds Preprocessor visited node count: 22/1000000 Post‐expand include size: 3978/2097152 bytes Template argument size: 0/2097152 bytes Highest expansion depth: 6/100 Expensive parser function count: 2/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 0/5000000 bytes Lua time usage: 0.019/10.000 seconds Lua memory usage: 985693/104857600 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 45.990 1 Template:Documentation 100.00% 45.990 1 -total --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">来自“<a dir="ltr" href="https://zh.wiktionary.org/w/index.php?title=Module:Parser&oldid=8782728">https://zh.wiktionary.org/w/index.php?title=Module:Parser&oldid=8782728</a>”</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:%E9%A1%B5%E9%9D%A2%E5%88%86%E7%B1%BB" title="Special:页面分类">分类</a>:<ul><li><a href="/wiki/Category:%E6%9C%AA%E5%88%86%E9%A1%9E%E6%A8%A1%E5%A1%8A" title="Category:未分類模塊">未分類模塊</a></li><li><a href="/wiki/Category:%E9%9C%80%E8%A6%81%E8%AA%AA%E6%98%8E%E6%96%87%E6%AA%94%E7%9A%84%E6%A8%A1%E6%9D%BF%E5%92%8C%E6%A8%A1%E7%B5%84" title="Category:需要說明文檔的模板和模組">需要說明文檔的模板和模組</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> 此页面最后编辑于2024年10月21日 (星期一) 15:22。</li> <li id="footer-info-copyright">本站的全部文字在<a rel="nofollow" class="external text" href="//creativecommons.org/licenses/by-sa/4.0/deed.zh">知识共享 署名-相同方式共享 4.0协议</a>之条款下提供,附加条款亦可能应用。(请参阅<a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">使用条款</a>)<br /> Wiktionary®和维基词典标志是<a rel="nofollow" class="external text" href="https://wikimediafoundation.org/zh">维基媒体基金会</a>的注册商标;维基™是维基媒体基金会的商标。<br />维基媒体基金会是在美国佛罗里达州登记的501(c)(3)<a class="external text" href="https://donate.wikimedia.org/wiki/Special:MyLanguage/Tax_deductibility">免税</a>、非营利、慈善机构。<br /></li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">隐私政策</a></li> <li id="footer-places-about"><a href="/wiki/Wiktionary:%E5%85%B3%E4%BA%8E">关于维基词典</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wiktionary:%E5%85%8D%E8%B4%A3%E5%A3%B0%E6%98%8E">免责声明</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">行为准则</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">开发者</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/zh.wiktionary.org">统计</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie声明</a></li> <li id="footer-places-mobileview"><a href="//zh.m.wiktionary.org/w/index.php?title=Module:Parser&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">手机版视图</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-694cf4987f-wxgwh","wgBackendResponseTime":255,"wgPageParseReport":{"limitreport":{"cputime":"0.054","walltime":"0.066","ppvisitednodes":{"value":22,"limit":1000000},"postexpandincludesize":{"value":3978,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":6,"limit":100},"expensivefunctioncount":{"value":2,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 45.990 1 Template:Documentation","100.00% 45.990 1 -total"]},"scribunto":{"limitreport-timeusage":{"value":"0.019","limit":"10.000"},"limitreport-memusage":{"value":985693,"limit":104857600}},"cachereport":{"origin":"mw-web.codfw.main-694cf4987f-wxgwh","timestamp":"20241126005137","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>