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-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-sticky-header-enabled vector-toc-not-available" lang="ar" dir="rtl"> <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-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-sticky-header-enabled vector-toc-not-available";var cookie=document.cookie.match(/(?:^|; )arwiktionarymwclientpreferences=([^;]+)/);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":[".\t,","٫\t٬"],"wgDigitTransformTable":[ "0\t1\t2\t3\t4\t5\t6\t7\t8\t9","٠\t١\t٢\t٣\t٤\t٥\t٦\t٧\t٨\t٩"],"wgDefaultDateFormat":"dmy","wgMonthNames":["","يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"wgRequestId":"1c81b5c7-f2fa-4388-89f6-a588ee5224ae","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"وحدة:parser","wgTitle":"parser","wgCurRevisionId":972760,"wgRevisionId":972760,"wgArticleId":221811,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["جميع وحدات ويكاموس"],"wgPageViewLanguage":"ar","wgPageContentLanguage":"ar","wgPageContentModel":"Scribunto","wgRelevantPageName":"وحدة:parser","wgRelevantArticleId":221811,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"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,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q123551062","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"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.PagePreviews","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","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"];</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=ar&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=ar&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=ar&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.17"> <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="ويكاموس"> <meta property="og:title" content="وحدة:parser - ويكاموس"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//ar.m.wiktionary.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:parser"> <link rel="alternate" type="application/x-wiki" title="عدل" href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser&action=edit"> <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="ويكاموس (ar)"> <link rel="EditURI" type="application/rsd+xml" href="//ar.wiktionary.org/w/api.php?action=rsd"> <link rel="canonical" href="https://ar.wiktionary.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:parser"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.ar"> <link rel="alternate" type="application/atom+xml" title="تلقيمة أتوم ويكاموس" href="/w/index.php?title=%D8%AE%D8%A7%D8%B5:%D8%A3%D8%AD%D8%AF%D8%AB_%D8%A7%D9%84%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%D8%A7%D8%AA&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 rtl sitedir-rtl mw-hide-empty-elt ns-828 ns-subject mw-editable page-وحدة_parser rootpage-وحدة_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" title="القائمة الرئيسة" > <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-الصفحة-الرئيسية" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9"><span>الصفحة الرئيسية</span></a></li><li id="n-ضع-سؤالا-لغويا" class="mw-list-item"><a href="https://ar.wiktionary.org/w/index.php?title=ويكاموس:أسئلة_لغوية&action=edit&section=new"><span>ضع سؤالا لغويا</span></a></li><li id="n-فهرس-الحروف" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D9%81%D9%87%D8%B1%D8%B3_%D8%A7%D9%84%D8%AD%D8%B1%D9%88%D9%81"><span>فهرس الحروف</span></a></li><li id="n-صفحة-عشوائية" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%B9%D8%B4%D9%88%D8%A7%D8%A6%D9%8A"><span>صفحة عشوائية</span></a></li><li id="n-specialpages" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%B5%D9%81%D8%AD%D8%A7%D8%AA_%D8%AE%D8%A7%D8%B5%D8%A9"><span>الصفحات الخاصة</span></a></li> </ul> </div> </div> <div id="p-مساهمة" class="vector-menu mw-portlet mw-portlet-مساهمة" > <div class="vector-menu-heading"> مساهمة </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-أحدث-التغييرات" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%A3%D8%AD%D8%AF%D8%AB_%D8%A7%D9%84%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%D8%A7%D8%AA"><span>أحدث التغييرات</span></a></li><li id="n-صفحات-مطلوبة" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%B5%D9%81%D8%AD%D8%A7%D8%AA_%D9%85%D8%B7%D9%84%D9%88%D8%A8%D8%A9"><span>صفحات مطلوبة</span></a></li><li id="n-ميدان-ويكاموس" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D9%85%D9%8A%D8%AF%D8%A7%D9%86"><span>ميدان ويكاموس</span></a></li><li id="n-بوابة-المجتمع" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A8%D9%88%D8%A7%D8%A8%D8%A9_%D8%A7%D9%84%D9%85%D8%AC%D8%AA%D9%85%D8%B9"><span>بوابة المجتمع</span></a></li><li id="n-تبرع" class="mw-list-item"><a href="https://donate.wikimedia.org/?wmf_source=donate&wmf_medium=sidebar&wmf_campaign=ar.wiktionary.org&uselang=ar"><span>تبرع</span></a></li> </ul> </div> </div> <div id="p-مساعدة" class="vector-menu mw-portlet mw-portlet-مساعدة" > <div class="vector-menu-heading"> مساعدة </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-مركز-مساعدة" class="mw-list-item"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents"><span>مركز مساعدة</span></a></li><li id="n-ماهية-القوالب" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D9%82%D9%88%D8%A7%D9%84%D8%A8"><span>ماهية القوالب</span></a></li><li id="n-إنشاء-صفحة" class="mw-list-item"><a href="/wiki/%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9:%D8%A5%D9%86%D8%B4%D8%A7%D8%A1_%D8%B5%D9%81%D8%AD%D8%A9_%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9"><span>إنشاء صفحة</span></a></li><li id="n-بدون-إنترنت" class="mw-list-item"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D9%83%D9%8A%D9%88%D9%8A%D9%83%D8%B3"><span>بدون إنترنت</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" 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-ar.svg" style="width: 7.5em; height: 1.625em;"> <img class="mw-logo-tagline" alt=" القاموس الحر" src="/static/images/mobile/copyright/wiktionary-tagline-ar.svg" width="108" height="18" style="width: 6.75em; height: 1.125em;"> </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/%D8%AE%D8%A7%D8%B5:%D8%A8%D8%AD%D8%AB" 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="خاص:بحث"> </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="https://donate.wikimedia.org/?wmf_source=donate&wmf_medium=sidebar&wmf_campaign=ar.wiktionary.org&uselang=ar" 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=%D8%AE%D8%A7%D8%B5:%D8%A5%D9%86%D8%B4%D8%A7%D8%A1_%D8%AD%D8%B3%D8%A7%D8%A8&returnto=%D9%88%D8%AD%D8%AF%D8%A9%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=%D8%AE%D8%A7%D8%B5:%D8%AF%D8%AE%D9%88%D9%84_%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85&returnto=%D9%88%D8%AD%D8%AF%D8%A9%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="https://donate.wikimedia.org/?wmf_source=donate&wmf_medium=sidebar&wmf_campaign=ar.wiktionary.org&uselang=ar"><span>تبرع</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=%D8%AE%D8%A7%D8%B5:%D8%A5%D9%86%D8%B4%D8%A7%D8%A1_%D8%AD%D8%B3%D8%A7%D8%A8&returnto=%D9%88%D8%AD%D8%AF%D8%A9%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=%D8%AE%D8%A7%D8%B5:%D8%AF%D8%AE%D9%88%D9%84_%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85&returnto=%D9%88%D8%AD%D8%AF%D8%A9%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/%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9:%D9%85%D9%82%D8%AF%D9%85%D8%A9" 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/%D8%AE%D8%A7%D8%B5:%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A7%D8%AA%D9%8A" title="قائمة بتعديلات قام بها عنوان الآي بي [y]" accesskey="y"><span>مساهمات</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D9%86%D9%82%D8%A7%D8%B4%D9%8A" title="نقاش حول التعديلات من عنوان الأيبي هذا [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="اذهب إلى المقالة في لغةٍ أخرى. مُتاحة في 23 لغة" > <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-23" 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">23 لغة</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-bjn mw-list-item"><a href="https://bjn.wiktionary.org/wiki/Modul:parser" title="Modul:parser – Banjar" lang="bjn" hreflang="bjn" data-title="Modul:parser" data-language-autonym="Banjar" data-language-local-name="Banjar" 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-fo mw-list-item"><a href="https://fo.wiktionary.org/wiki/Module:parser" title="Module:parser – الفاروية" lang="fo" hreflang="fo" data-title="Module:parser" data-language-autonym="Føroyskt" data-language-local-name="الفاروية" class="interlanguage-link-target"><span>Føroyskt</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-ko mw-list-item"><a href="https://ko.wiktionary.org/wiki/%EB%AA%A8%EB%93%88:parser" title="모듈:parser – الكورية" lang="ko" hreflang="ko" data-title="모듈:parser" data-language-autonym="한국어" data-language-local-name="الكورية" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-ku mw-list-item"><a href="https://ku.wiktionary.org/wiki/Modul:parser" title="Modul:parser – الكردية" lang="ku" hreflang="ku" data-title="Modul:parser" data-language-autonym="Kurdî" data-language-local-name="الكردية" class="interlanguage-link-target"><span>Kurdî</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-mg mw-list-item"><a href="https://mg.wiktionary.org/wiki/Module:parser" title="Module:parser – الملغاشي" lang="mg" hreflang="mg" data-title="Module:parser" data-language-autonym="Malagasy" data-language-local-name="الملغاشي" class="interlanguage-link-target"><span>Malagasy</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-tl mw-list-item"><a href="https://tl.wiktionary.org/wiki/Module:parser" title="Module:parser – التاغالوغية" lang="tl" hreflang="tl" data-title="Module:parser" data-language-autonym="Tagalog" data-language-local-name="التاغالوغية" class="interlanguage-link-target"><span>Tagalog</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><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wiktionary.org/wiki/Module:Parser" title="Module:Parser – الصينية" lang="zh" hreflang="zh" data-title="Module:Parser" data-language-autonym="中文" data-language-local-name="الصينية" class="interlanguage-link-target"><span>中文</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/%D9%88%D8%AD%D8%AF%D8%A9: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=%D9%86%D9%82%D8%A7%D8%B4_%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A9: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/%D9%88%D8%AD%D8%AF%D8%A9:parser"><span>اقرأ</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9: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=%D9%88%D8%AD%D8%AF%D8%A9: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/%D9%88%D8%AD%D8%AF%D8%A9:parser"><span>اقرأ</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser&action=edit" title="تعديل هذه الصفحة [e]" accesskey="e"><span>عدّل</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9: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/%D8%AE%D8%A7%D8%B5:%D9%85%D8%A7%D8%B0%D8%A7_%D9%8A%D8%B5%D9%84_%D9%87%D9%86%D8%A7/%D9%88%D8%AD%D8%AF%D8%A9:parser" title="قائمة بكل صفحات الويكي التي تصل هنا [j]" accesskey="j"><span>ماذا يصل هنا</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%A3%D8%AD%D8%AF%D8%AB_%D8%A7%D9%84%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%D8%A7%D8%AA_%D8%A7%D9%84%D9%85%D9%88%D8%B5%D9%88%D9%84%D8%A9/%D9%88%D8%AD%D8%AF%D8%A9: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=ar" title="ارفع ملفات [u]" accesskey="u"><span>رفع ملف</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser&oldid=972760" title="وصلة دائمة لهذه النسخة من الصفحة"><span>وصلة دائمة</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser&action=info" title="المزيد من المعلومات عن هذه الصفحة"><span>معلومات الصفحة</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=%D8%AE%D8%A7%D8%B5:%D8%AA%D9%82%D8%B5%D9%8A%D8%B1_%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B1&url=https%3A%2F%2Far.wiktionary.org%2Fwiki%2F%25D9%2588%25D8%25AD%25D8%25AF%25D8%25A9%3Aparser"><span>رابط مختصر</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=%D8%AE%D8%A7%D8%B5:QrCode&url=https%3A%2F%2Far.wiktionary.org%2Fwiki%2F%25D9%2588%25D8%25AD%25D8%25AF%25D8%25A9%3Aparser"><span>تنزيل رمز الاستجابة السريعة</span></a></li><li class="mw-list-item"><a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser&useparsoid=0"><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=%D8%AE%D8%A7%D8%B5:DownloadAsPdf&page=%D9%88%D8%AD%D8%AF%D8%A9%3Aparser&action=show-download-screen"><span>تحميل بصيغة المستندات المنقولة</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-rtl mw-parser-output" lang="ar" dir="rtl"><style data-mw-deduplicate="TemplateStyles:r996879">.mw-parser-output .documentation,.mw-parser-output .documentation-metadata{border:1px solid #a2a9b1;background-color:#ecfcf4;clear:both}.mw-parser-output .documentation{margin:1em 0 0 0;padding:1em}.mw-parser-output .documentation-metadata{margin:0.2em 0;font-style:italic;padding:0.4em 1em}.mw-parser-output .documentation-startbox{padding-bottom:3px;border-bottom:1px solid #aaa;margin-bottom:1ex}.mw-parser-output .documentation-heading{font-weight:bold;font-size:125%}.mw-parser-output .documentation-clear{clear:both}.mw-parser-output .documentation-toolbar{font-style:normal;font-size:85%}@media screen{html.skin-theme-clientpref-night .mw-parser-output .documentation,html.skin-theme-clientpref-night .mw-parser-output .documentation-metadata{background-color:#0b1e1c}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .documentation,html.skin-theme-clientpref-os .mw-parser-output .documentation-metadata{background-color:#0b1e1c}}</style><div class="documentation-container" role="complementary" aria-labelledby="documentation-heading"> <div class="documentation"> <div class="documentation-startbox"> <span class="documentation-heading" id="documentation-heading"><span typeof="mw:File"><span><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Test_Template_Info-Icon_-_Version_%282%29.svg/50px-Test_Template_Info-Icon_-_Version_%282%29.svg.png" decoding="async" width="50" height="22" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Test_Template_Info-Icon_-_Version_%282%29.svg/75px-Test_Template_Info-Icon_-_Version_%282%29.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/43/Test_Template_Info-Icon_-_Version_%282%29.svg/100px-Test_Template_Info-Icon_-_Version_%282%29.svg.png 2x" data-file-width="1792" data-file-height="800" /></span></span> توثيق الوحدة </span><span class="mw-editsection-like plainlinks">[<a class="external text" href="https://ar.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D8%B4%D8%B1%D8%AD&action=edit&preload=%D9%82%D8%A7%D9%84%D8%A8%3A%D8%AA%D9%88%D8%AB%D9%8A%D9%82%2F%D9%85%D8%B3%D8%A8%D9%82-%D9%88%D8%AD%D8%AF%D8%A9-%D8%B4%D8%B1%D8%AD">أنشئ</a>] [<a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%A5%D9%81%D8%B1%D8%A7%D8%BA_%D8%A7%D9%84%D9%83%D8%A7%D8%B4/%D9%88%D8%AD%D8%AF%D8%A9:parser" title="خاص:إفراغ الكاش/وحدة:parser">محو الاختزان</a>][<a class="external text" href="https://templatecount.toolforge.org/index.php?lang=ar&namespace=828&name=parser">استخدامات</a>] [<a class="external text" href="https://ar.wikipedia.org/w/index.php?title=خاص:بحث&fulltext=Search&ns10=1&ns8=1&search=insource%3A%2F(invoke%7Cاستدعاء)%3A+%2Aparser%5C%7C%2F">قوالب</a>]</span></div> <div class="documentation-clear"></div> </div> <div role="note" class="documentation-metadata plainlinks">يمكنك أن تنشئ صفحة توثيق لهذه <a href="/w/index.php?title=%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D9%84%D9%88%D8%A7&action=edit&redlink=1" class="new" title="ويكاموس:لوا (الصفحة غير موجودة)">الوحدة</a> (<a class="external text" href="https://ar.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D8%B4%D8%B1%D8%AD&action=edit&preload=%D9%82%D8%A7%D9%84%D8%A8%3A%D8%AA%D9%88%D8%AB%D9%8A%D9%82%2F%D9%85%D8%B3%D8%A8%D9%82-%D9%88%D8%AD%D8%AF%D8%A9-%D8%B4%D8%B1%D8%AD">أنشئ</a>).<br />يمكن للمحررين تجريب تعديلاتهم على الوحدة في صفحات ملعب <span class="documentation-toolbar">(<a class="external text" href="https://ar.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D9%85%D9%84%D8%B9%D8%A8&action=edit&preload=%D9%82%D8%A7%D9%84%D8%A8%3A%D8%AA%D9%88%D8%AB%D9%8A%D9%82%2F%D9%85%D8%B3%D8%A8%D9%82-%D9%85%D9%84%D8%B9%D8%A8+%D9%88%D8%AD%D8%AF%D8%A9">أنشئ</a> | <a class="external text" href="https://ar.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D9%85%D9%84%D8%B9%D8%A8&preload=%D9%88%D8%AD%D8%AF%D8%A9%3Aparser&action=edit&summary=%D8%A5%D9%86%D8%B4%D8%A7%D8%A1+%D9%86%D8%B3%D8%AE%D8%A9+%D9%85%D9%84%D8%B9%D8%A8+%D9%84%D9%80+%5B%5B%D9%88%D8%AD%D8%AF%D8%A9%3Aparser%5D%5D">مرآة</a>)</span> ومختبر <span class="documentation-toolbar">(<a class="external text" href="https://ar.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D9%85%D8%AE%D8%AA%D8%A8%D8%B1&action=edit&preload=%D9%82%D8%A7%D9%84%D8%A8%3A%D8%AA%D9%88%D8%AB%D9%8A%D9%82%2F%D9%85%D8%B3%D8%A8%D9%82%2F%D9%85%D8%AE%D8%AA%D8%A8%D8%B1+%D9%88%D8%AD%D8%AF%D8%A9">أنشئ</a>)</span>.<br />من فضلك أضف التصنيفات في الصفحة الفرعية للقالب <a href="/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9:parser/%D8%B4%D8%B1%D8%AD&action=edit&redlink=1" class="new" title="وحدة:parser/شرح (الصفحة غير موجودة)">/شرح</a>. <a href="/wiki/%D8%AE%D8%A7%D8%B5:%D9%81%D9%87%D8%B1%D8%B3_%D8%A8%D8%A7%D8%AF%D8%A6%D8%A9/%D9%88%D8%AD%D8%AF%D8%A9:parser/" title="خاص:فهرس بادئة/وحدة:parser/">الصفحات الفرعية لـ وحدة</a>.</div></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">concat</span> <span class="o">=</span> <span class="nb">table.concat</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></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-3"><a href="#L-3"><span class="linenos" data-line="3"></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-4"><a href="#L-4"><span class="linenos" data-line="4"></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-5"><a href="#L-5"><span class="linenos" data-line="5"></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-6"><a href="#L-6"><span class="linenos" data-line="6"></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-7"><a href="#L-7"><span class="linenos" data-line="7"></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-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="nb">select</span> <span class="o">=</span> <span class="nb">select</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">setmetatable</span> <span class="o">=</span> <span class="nb">setmetatable</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="nb">type</span> <span class="o">=</span> <span class="nb">type</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="n">unpack</span> <span class="o">=</span> <span class="n">unpack</span> </span><span id="L-12"><a href="#L-12"><span class="linenos" data-line="12"></span></a> </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">classes</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></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:parser/data"</span><span class="p">).</span><span class="n">metamethods</span> </span><span id="L-15"><a href="#L-15"><span class="linenos" data-line="15"></span></a> </span><span id="L-16"><a href="#L-16"><span class="linenos" data-line="16"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-17"><a href="#L-17"><span class="linenos" data-line="17"></span></a><span class="c1">--</span> </span><span id="L-18"><a href="#L-18"><span class="linenos" data-line="18"></span></a><span class="c1">-- Helper functions</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">------------------------------------------------------------------------------------</span> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></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">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="kr">then</span> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a> <span class="kr">elseif</span> <span class="p">...</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="n">get_nested</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="p">...)</span> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a> <span class="kr">end</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">a</span><span class="p">[</span><span class="n">b</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><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></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">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 class="p">...)</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">a</span> <span class="ow">and</span> <span class="n">b</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a> <span class="kr">return</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a> <span class="kr">elseif</span> <span class="n">c</span> <span class="ow">and</span> <span class="p">...</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="n">a</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="ow">or</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">return</span> <span class="n">set_nested</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 class="p">...)</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a> <span class="kr">end</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a> <span class="n">a</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</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><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></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-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a> <span class="kr">if</span> <span class="n">parent</span> <span class="kr">then</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></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-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a> <span class="kr">if</span> <span class="n">metamethods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></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-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a> <span class="kr">end</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a> <span class="kr">end</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a> <span class="kr">end</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a> <span class="kr">return</span> <span class="n">child</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><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></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-53"><a href="#L-53"><span class="linenos" data-line="53"></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-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">is_node</span><span class="p">(</span><span class="n">value</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">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="ow">and</span> <span class="kc">true</span> <span class="ow">or</span> <span class="kc">false</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="c1">-- Recursively calling tostring() adds to the C stack (limit: 200), whereas calling __tostring metamethods directly does not. Occasionally relevant when dealing with very deep nesting.</span> </span><span id="L-61"><a href="#L-61"><span class="linenos" data-line="61"></span></a><span class="kd">local</span> <span class="nb">tostring</span> </span><span id="L-62"><a href="#L-62"><span class="linenos" data-line="62"></span></a><span class="kr">do</span> </span><span id="L-63"><a href="#L-63"><span class="linenos" data-line="63"></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-64"><a href="#L-64"><span class="linenos" data-line="64"></span></a> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></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-66"><a href="#L-66"><span class="linenos" data-line="66"></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-67"><a href="#L-67"><span class="linenos" data-line="67"></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-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a> <span class="kr">end</span> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></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-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a> <span class="kr">end</span> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a><span class="kr">end</span> </span><span id="L-72"><a href="#L-72"><span class="linenos" data-line="72"></span></a> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">type_or_class</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">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="ow">or</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a><span class="kr">end</span> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a> </span><span id="L-77"><a href="#L-77"><span class="linenos" data-line="77"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-78"><a href="#L-78"><span class="linenos" data-line="78"></span></a><span class="c1">--</span> </span><span id="L-79"><a href="#L-79"><span class="linenos" data-line="79"></span></a><span class="c1">-- Nodes</span> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a><span class="c1">--</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a><span class="kd">local</span> <span class="n">Node</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></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-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></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-87"><a href="#L-87"><span class="linenos" data-line="87"></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-88"><a href="#L-88"><span class="linenos" data-line="88"></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">i</span> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a><span class="kr">end</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></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-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a> <span class="kd">local</span> <span class="n">v</span> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a> <span class="kr">repeat</span> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a> <span class="n">v</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-95"><a href="#L-95"><span class="linenos" data-line="95"></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-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a> <span class="kr">return</span> <span class="n">v</span><span class="p">,</span> <span class="n">i</span> </span><span id="L-97"><a href="#L-97"><span class="linenos" data-line="97"></span></a><span class="kr">end</span> </span><span id="L-98"><a href="#L-98"><span class="linenos" data-line="98"></span></a> </span><span id="L-99"><a href="#L-99"><span class="linenos" data-line="99"></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-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="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-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></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-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></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-106"><a href="#L-106"><span class="linenos" data-line="106"></span></a> </span><span id="L-107"><a href="#L-107"><span class="linenos" data-line="107"></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-108"><a href="#L-108"><span class="linenos" data-line="108"></span></a><span class="kr">do</span> </span><span id="L-109"><a href="#L-109"><span class="linenos" data-line="109"></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-110"><a href="#L-110"><span class="linenos" data-line="110"></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-111"><a href="#L-111"><span class="linenos" data-line="111"></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-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="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-114"><a href="#L-114"><span class="linenos" data-line="114"></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-115"><a href="#L-115"><span class="linenos" data-line="115"></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-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a> <span class="kr">end</span> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></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-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</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">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="n">node</span> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a> <span class="p">}</span> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></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-124"><a href="#L-124"><span class="linenos" data-line="124"></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-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a> <span class="kr">return</span> <span class="n">self</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">pop</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">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></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-131"><a href="#L-131"><span class="linenos" data-line="131"></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-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a> <span class="kr">end</span> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">catch_values</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a> <span class="kd">local</span> <span class="n">v</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="p">...</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></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-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">__call</span><span class="p">()</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a> <span class="kr">end</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a> <span class="kr">return</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 class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">k</span> <span class="o">=</span> <span class="n">k</span> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a> <span class="kr">if</span> <span class="n">is_node</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-145"><a href="#L-145"><span class="linenos" data-line="145"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push</span><span class="p">(</span><span class="n">v</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">end</span> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a> <span class="kr">return</span> <span class="n">v</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a> <span class="kr">end</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></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-151"><a href="#L-151"><span class="linenos" data-line="151"></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-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a> <span class="kd">local</span> <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-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">catch_values</span><span class="p">(</span><span class="n">node</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-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a> <span class="kr">end</span> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></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-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a> <span class="n">next_func</span> <span class="o">=</span> <span class="n">next_func</span> <span class="ow">or</span> <span class="s2">"next"</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></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-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a> <span class="kr">end</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a><span class="kr">end</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></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-164"><a href="#L-164"><span class="linenos" data-line="164"></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-165"><a href="#L-165"><span class="linenos" data-line="165"></span></a><span class="kr">end</span> </span><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></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-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-169"><a href="#L-169"><span class="linenos" data-line="169"></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-170"><a href="#L-170"><span class="linenos" data-line="170"></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">i</span><span class="p">]</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></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">v</span><span class="p">))</span> </span><span id="L-172"><a href="#L-172"><span class="linenos" data-line="172"></span></a> <span class="kr">end</span> </span><span id="L-173"><a href="#L-173"><span class="linenos" data-line="173"></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-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><span id="L-176"><a href="#L-176"><span class="linenos" data-line="176"></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-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="n">inherit_metamethods</span><span class="p">({</span><span class="nb">type</span> <span class="o">=</span> <span class="n">class</span><span class="p">},</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></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-179"><a href="#L-179"><span class="linenos" data-line="179"></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-180"><a href="#L-180"><span class="linenos" data-line="180"></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-181"><a href="#L-181"><span class="linenos" data-line="181"></span></a><span class="kr">end</span> </span><span id="L-182"><a href="#L-182"><span class="linenos" data-line="182"></span></a> </span><span id="L-183"><a href="#L-183"><span class="linenos" data-line="183"></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-184"><a href="#L-184"><span class="linenos" data-line="184"></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-185"><a href="#L-185"><span class="linenos" data-line="185"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">override</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">route</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></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-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a><span class="kr">end</span> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a><span class="kr">do</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a> <span class="kd">local</span> <span class="n">Proxy</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></span></a> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></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-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a> <span class="kr">return</span> <span class="n">Proxy</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="ow">or</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-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a> <span class="kr">end</span> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></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-199"><a href="#L-199"><span class="linenos" data-line="199"></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-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="kr">then</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></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-202"><a href="#L-202"><span class="linenos" data-line="202"></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-203"><a href="#L-203"><span class="linenos" data-line="203"></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-204"><a href="#L-204"><span class="linenos" data-line="204"></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-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a> <span class="kr">else</span> </span><span id="L-206"><a href="#L-206"><span class="linenos" data-line="206"></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-207"><a href="#L-207"><span class="linenos" data-line="207"></span></a> <span class="kr">end</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a> <span class="kr">end</span> </span><span id="L-209"><a href="#L-209"><span class="linenos" data-line="209"></span></a> </span><span id="L-210"><a href="#L-210"><span class="linenos" data-line="210"></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-211"><a href="#L-211"><span class="linenos" data-line="211"></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-212"><a href="#L-212"><span class="linenos" data-line="212"></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-213"><a href="#L-213"><span class="linenos" data-line="213"></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-214"><a href="#L-214"><span class="linenos" data-line="214"></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-215"><a href="#L-215"><span class="linenos" data-line="215"></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-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a> <span class="kr">end</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">iter</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></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-220"><a href="#L-220"><span class="linenos" data-line="220"></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-221"><a href="#L-221"><span class="linenos" data-line="221"></span></a> <span class="kr">if</span> <span class="n">char</span> <span class="kr">then</span> </span><span id="L-222"><a href="#L-222"><span class="linenos" data-line="222"></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-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a> <span class="kr">end</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">Node</span><span class="p">:</span><span class="nf">new_proxy</span><span class="p">()</span> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a> <span class="n">__node</span> <span class="o">=</span> <span class="n">self</span><span class="p">,</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a> <span class="n">__chars</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a> <span class="n">__parents</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a> <span class="n">__keys</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a> <span class="n">__len</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a> <span class="p">},</span> <span class="n">Proxy</span><span class="p">)</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a> <span class="kr">end</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><span id="L-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-238"><a href="#L-238"><span class="linenos" data-line="238"></span></a><span class="c1">--</span> </span><span id="L-239"><a href="#L-239"><span class="linenos" data-line="239"></span></a><span class="c1">-- Parser</span> </span><span id="L-240"><a href="#L-240"><span class="linenos" data-line="240"></span></a><span class="c1">--</span> </span><span id="L-241"><a href="#L-241"><span class="linenos" data-line="241"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a><span class="kd">local</span> <span class="n">Parser</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></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-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">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-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a> <span class="kr">return</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 class="ow">or</span> <span class="s2">""</span> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a><span class="kr">end</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></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-251"><a href="#L-251"><span class="linenos" data-line="251"></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="ow">or</span> <span class="mi">1</span><span class="p">)</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">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-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="kr">then</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></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-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a> <span class="kr">end</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></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-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a><span class="kr">end</span> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></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-262"><a href="#L-262"><span class="linenos" data-line="262"></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-263"><a href="#L-263"><span class="linenos" data-line="263"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="kr">then</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></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-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a> <span class="kr">else</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></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-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a> <span class="kr">end</span> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></span></a><span class="kr">end</span> </span><span id="L-269"><a href="#L-269"><span class="linenos" data-line="269"></span></a> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></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-271"><a href="#L-271"><span class="linenos" data-line="271"></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-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="kr">then</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></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-274"><a href="#L-274"><span class="linenos" data-line="274"></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-275"><a href="#L-275"><span class="linenos" data-line="275"></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-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a> <span class="kr">end</span> </span><span id="L-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a> <span class="kr">else</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></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-279"><a href="#L-279"><span class="linenos" data-line="279"></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-280"><a href="#L-280"><span class="linenos" data-line="280"></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-281"><a href="#L-281"><span class="linenos" data-line="281"></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-282"><a href="#L-282"><span class="linenos" data-line="282"></span></a> <span class="kr">end</span> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a> <span class="kr">end</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a><span class="kr">end</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></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-287"><a href="#L-287"><span class="linenos" data-line="287"></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-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="kr">then</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></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-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a> <span class="kr">end</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">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></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-293"><a href="#L-293"><span class="linenos" data-line="293"></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-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> <span class="kr">return</span> <span class="n">token</span> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a><span class="kr">end</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></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-298"><a href="#L-298"><span class="linenos" data-line="298"></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-299"><a href="#L-299"><span class="linenos" data-line="299"></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-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a><span class="kr">end</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a><span class="c1">-- Unlike default table.concat, this respects __tostring metamethods.</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></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-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">a</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-305"><a href="#L-305"><span class="linenos" data-line="305"></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-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a> <span class="kr">end</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">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">a</span><span class="p">)</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kd">local</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="kr">for</span> <span class="n">i</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">b</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">1</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">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-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">ret</span><span class="p">,</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-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">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">ret</span><span class="p">)</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">emitted</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></span></a> <span class="n">delta</span> <span class="o">=</span> <span class="n">delta</span> <span class="ow">or</span> <span class="o">-</span><span class="mi">1</span> </span><span id="L-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a> <span class="kd">local</span> <span class="n">i</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="mi">0</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-318"><a href="#L-318"><span class="linenos" data-line="318"></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-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a> <span class="kr">while</span> <span class="n">layer</span> <span class="ow">and</span> <span class="o">-</span><span class="n">delta</span> <span class="o">></span> <span class="n">layer_len</span> <span class="kr">do</span> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></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-321"><a href="#L-321"><span class="linenos" data-line="321"></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-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a> <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-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> <span class="n">layer_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</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 class="kr">return</span> <span class="n">layer</span> <span class="ow">and</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-326"><a href="#L-326"><span class="linenos" data-line="326"></span></a><span class="kr">end</span> </span><span id="L-327"><a href="#L-327"><span class="linenos" data-line="327"></span></a> </span><span id="L-328"><a href="#L-328"><span class="linenos" data-line="328"></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-329"><a href="#L-329"><span class="linenos" data-line="329"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></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-331"><a href="#L-331"><span class="linenos" data-line="331"></span></a> <span class="n">route</span> <span class="o">=</span> <span class="n">route</span> </span><span id="L-332"><a href="#L-332"><span class="linenos" data-line="332"></span></a> <span class="p">}</span> </span><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></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-334"><a href="#L-334"><span class="linenos" data-line="334"></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-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><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></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-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="kd">local</span> <span class="n">sublayer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></span></a> <span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span><span class="p">,</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> <span class="n">sublayer</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a> <span class="p">}</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a> <span class="kr">if</span> <span class="n">inherit</span> <span class="kr">then</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></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-344"><a href="#L-344"><span class="linenos" data-line="344"></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-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="n">layer</span><span class="p">,</span> </span><span id="L-346"><a href="#L-346"><span class="linenos" data-line="346"></span></a> <span class="n">__newindex</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-347"><a href="#L-347"><span class="linenos" data-line="347"></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-348"><a href="#L-348"><span class="linenos" data-line="348"></span></a> <span class="kr">end</span> </span><span id="L-349"><a href="#L-349"><span class="linenos" data-line="349"></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-350"><a href="#L-350"><span class="linenos" data-line="350"></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-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a><span class="kr">end</span> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a> </span><span id="L-353"><a href="#L-353"><span class="linenos" data-line="353"></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-354"><a href="#L-354"><span class="linenos" data-line="354"></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-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></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-357"><a href="#L-357"><span class="linenos" data-line="357"></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-358"><a href="#L-358"><span class="linenos" data-line="358"></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-359"><a href="#L-359"><span class="linenos" data-line="359"></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="p">]</span> <span class="ow">or</span> <span class="n">self</span> </span><span id="L-360"><a href="#L-360"><span class="linenos" data-line="360"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">layer</span><span class="p">.</span><span class="n">sublayer</span> <span class="kr">then</span> </span><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a> <span class="kr">break</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a> <span class="kr">end</span> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></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-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a> <span class="kr">end</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a><span class="kr">end</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></span></a> </span><span id="L-368"><a href="#L-368"><span class="linenos" data-line="368"></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-369"><a href="#L-369"><span class="linenos" data-line="369"></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-370"><a href="#L-370"><span class="linenos" data-line="370"></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-371"><a href="#L-371"><span class="linenos" data-line="371"></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 class="ow">or</span> <span class="n">self</span> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a> <span class="kr">return</span> <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-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a><span class="kr">end</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></span></a> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></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-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> <span class="kd">local</span> <span class="n">failed_route</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">self</span><span class="p">.</span><span class="n">head</span><span class="p">,</span> <span class="n">route</span><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">failed_route</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="kr">return</span> <span class="kc">false</span><span class="p">,</span> <span class="n">failed_route</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a> <span class="kr">end</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></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-381"><a href="#L-381"><span class="linenos" data-line="381"></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">route</span><span class="p">](</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></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-383"><a href="#L-383"><span class="linenos" data-line="383"></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-384"><a href="#L-384"><span class="linenos" data-line="384"></span></a> <span class="kr">end</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a> <span class="kr">if</span> <span class="n">layer</span><span class="p">.</span><span class="n">fail</span> <span class="kr">then</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a> <span class="kr">return</span> <span class="kc">false</span><span class="p">,</span> <span class="n">layer</span> </span><span id="L-387"><a href="#L-387"><span class="linenos" data-line="387"></span></a> <span class="kr">end</span> </span><span id="L-388"><a href="#L-388"><span class="linenos" data-line="388"></span></a> <span class="kr">return</span> <span class="kc">true</span><span class="p">,</span> <span class="n">layer</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a><span class="kr">end</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></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-392"><a href="#L-392"><span class="linenos" data-line="392"></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-393"><a href="#L-393"><span class="linenos" data-line="393"></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="ow">or</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(),</span> <span class="p">...)</span> </span><span id="L-394"><a href="#L-394"><span class="linenos" data-line="394"></span></a><span class="kr">end</span> </span><span id="L-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></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-397"><a href="#L-397"><span class="linenos" data-line="397"></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-398"><a href="#L-398"><span class="linenos" data-line="398"></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-399"><a href="#L-399"><span class="linenos" data-line="399"></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">head</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><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></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-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">traverse</span><span class="p">()</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></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-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="kr">then</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a> <span class="kr">end</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a> <span class="kr">end</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="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-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a><span class="c1">-- false is used as the default key.</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a><span class="kr">do</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></span></a> <span class="kd">local</span> <span class="n">Switch</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></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-420"><a href="#L-420"><span class="linenos" data-line="420"></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-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">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-424"><a href="#L-424"><span class="linenos" data-line="424"></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-425"><a href="#L-425"><span class="linenos" data-line="425"></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-426"><a href="#L-426"><span class="linenos" data-line="426"></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-427"><a href="#L-427"><span class="linenos" data-line="427"></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-428"><a href="#L-428"><span class="linenos" data-line="428"></span></a> <span class="kr">end</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="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-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 class="kr">end</span> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></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-434"><a href="#L-434"><span class="linenos" data-line="434"></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-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="n">inherit_metamethods</span><span class="p">({},</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></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-437"><a href="#L-437"><span class="linenos" data-line="437"></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-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="c1">-- Generate a new parser object, which is used for a specific parse.</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></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-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">text</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">head</span> <span class="o">=</span> <span class="mi">1</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a> <span class="p">},</span> <span class="n">self</span><span class="p">)</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">parse</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></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-450"><a href="#L-450"><span class="linenos" data-line="450"></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">get</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-451"><a href="#L-451"><span class="linenos" data-line="451"></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-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a> <span class="c1">-- This shouldn't happen.</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></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-454"><a href="#L-454"><span class="linenos" data-line="454"></span></a> <span class="kr">elseif</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></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-456"><a href="#L-456"><span class="linenos" data-line="456"></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-457"><a href="#L-457"><span class="linenos" data-line="457"></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-458"><a href="#L-458"><span class="linenos" data-line="458"></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-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a> <span class="kr">end</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Parser exited with bad route."</span><span class="p">)</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a><span class="kr">end</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="kd">local</span> <span class="n">export</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-464"><a href="#L-464"><span class="linenos" data-line="464"></span></a> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></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-466"><a href="#L-466"><span class="linenos" data-line="466"></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-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a><span class="n">export</span><span class="p">.</span><span class="n">type_or_class</span> <span class="o">=</span> <span class="n">type_or_class</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></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-470"><a href="#L-470"><span class="linenos" data-line="470"></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-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a><span class="kr">end</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a><span class="kr">return</span> <span class="n">export</span> </span></pre></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐d8647bfd6‐pbmgq Cached time: 20250221140405 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1] CPU time usage: 0.049 seconds Real time usage: 0.065 seconds Preprocessor visited node count: 18/1000000 Post‐expand include size: 2852/2097152 bytes Template argument size: 0/2097152 bytes Highest expansion depth: 2/100 Expensive parser function count: 3/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 1085/5000000 bytes Lua time usage: 0.028/10.000 seconds Lua memory usage: 908593/104857600 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 0.000 1 -total --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?useformat=desktop&type=1x1&usesul3=0" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">مجلوبة من «<a dir="ltr" href="https://ar.wiktionary.org/w/index.php?title=وحدة:parser&oldid=972760">https://ar.wiktionary.org/w/index.php?title=وحدة:parser&oldid=972760</a>»</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/%D8%AE%D8%A7%D8%B5:%D8%AA%D8%B5%D9%86%D9%8A%D9%81%D8%A7%D8%AA" title="خاص:تصنيفات">تصنيف</a>: <ul><li><a href="/wiki/%D8%AA%D8%B5%D9%86%D9%8A%D9%81:%D8%AC%D9%85%D9%8A%D8%B9_%D9%88%D8%AD%D8%AF%D8%A7%D8%AA_%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3" title="تصنيف:جميع وحدات ويكاموس">جميع وحدات ويكاموس</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"> آخر تعديل لهذه الصفحة كان يوم 10 مايو 2024، الساعة 04:03.</li> <li id="footer-info-copyright">النصوص متاحة تحت <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">رخصة المشاع الإبداعي الملزمة بنسبة العمل لمؤلفه وبترخيص الأعمال المشتقة بالمثل</a>، قد تُطبّق شروط إضافية. انظر <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">شروط الاستخدام</a> للتفاصيل.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy/ar">سياسة الخصوصية</a></li> <li id="footer-places-about"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%B9%D9%86">حول ويكاموس</a></li> <li id="footer-places-disclaimers"><a href="/wiki/%D9%88%D9%8A%D9%83%D8%A7%D9%85%D9%88%D8%B3:%D8%A5%D8%AE%D9%84%D8%A7%D8%A1_%D9%85%D8%B3%D8%A4%D9%88%D9%84%D9%8A%D8%A9_%D8%B9%D8%A7%D9%85">إخلاء مسؤولية</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/#/ar.wiktionary.org">إحصائيات</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">بيان تعريف الارتباطات</a></li> <li id="footer-places-mobileview"><a href="//ar.m.wiktionary.org/w/index.php?title=%D9%88%D8%AD%D8%AF%D8%A9: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"><picture><source media="(min-width: 500px)" srcset="/static/images/footer/wikimedia-button.svg" width="84" height="29"><img src="/static/images/footer/wikimedia.svg" width="25" height="25" alt="Wikimedia Foundation" lang="en" loading="lazy"></picture></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"><picture><source media="(min-width: 500px)" srcset="/w/resources/assets/poweredby_mediawiki.svg" width="88" height="31"><img src="/w/resources/assets/mediawiki_compact.svg" alt="Powered by MediaWiki" width="25" height="25" loading="lazy"></picture></a></li> </ul> </footer> </div> </div> </div> <div class="vector-header-container vector-sticky-header-container"> <div id="vector-sticky-header" class="vector-sticky-header"> <div class="vector-sticky-header-start"> <div class="vector-sticky-header-icon-start vector-button-flush-left vector-button-flush-right" aria-hidden="true"> <button class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-sticky-header-search-toggle" tabindex="-1" data-event-name="ui.vector-sticky-search-form.icon"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>بحث</span> </button> </div> <div role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box"> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail"> <form action="/w/index.php" id="vector-sticky-search-form" class="cdx-search-input cdx-search-input--has-end-button"> <div 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="ابحث في ويكاموس"> <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="خاص:بحث"> </div> <button class="cdx-button cdx-search-input__end-button">بحث</button> </form> </div> </div> </div> <div class="vector-sticky-header-context-bar"> <div class="vector-sticky-header-context-bar-primary" aria-hidden="true" ><span class="mw-page-title-namespace">وحدة</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">parser</span></div> </div> </div> <div class="vector-sticky-header-end" aria-hidden="true"> <div class="vector-sticky-header-icons"> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-talk-sticky-header" tabindex="-1" data-event-name="talk-sticky-header"><span class="vector-icon mw-ui-icon-speechBubbles mw-ui-icon-wikimedia-speechBubbles"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-subject-sticky-header" tabindex="-1" data-event-name="subject-sticky-header"><span class="vector-icon mw-ui-icon-article mw-ui-icon-wikimedia-article"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-history-sticky-header" tabindex="-1" data-event-name="history-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-history mw-ui-icon-wikimedia-wikimedia-history"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only mw-watchlink" id="ca-watchstar-sticky-header" tabindex="-1" data-event-name="watch-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-star mw-ui-icon-wikimedia-wikimedia-star"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-edit-sticky-header" tabindex="-1" data-event-name="wikitext-edit-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-wikiText mw-ui-icon-wikimedia-wikimedia-wikiText"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-ve-edit-sticky-header" tabindex="-1" data-event-name="ve-edit-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-edit mw-ui-icon-wikimedia-wikimedia-edit"></span> <span></span> </a> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only" id="ca-viewsource-sticky-header" tabindex="-1" data-event-name="ve-edit-protected-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-editLock mw-ui-icon-wikimedia-wikimedia-editLock"></span> <span></span> </a> </div> <div class="vector-sticky-header-buttons"> <button class="cdx-button cdx-button--weight-quiet mw-interlanguage-selector" id="p-lang-btn-sticky-header" tabindex="-1" data-event-name="ui.dropdown-p-lang-btn-sticky-header"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>23 لغة</span> </button> <a href="#" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive" id="ca-addsection-sticky-header" tabindex="-1" data-event-name="addsection-sticky-header"><span class="vector-icon mw-ui-icon-speechBubbleAdd-progressive mw-ui-icon-wikimedia-speechBubbleAdd-progressive"></span> <span>أضف موضوعًا</span> </a> </div> <div class="vector-sticky-header-icon-end"> <div class="vector-user-links"> </div> </div> </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-d8647bfd6-pbmgq","wgBackendResponseTime":303,"wgPageParseReport":{"limitreport":{"cputime":"0.049","walltime":"0.065","ppvisitednodes":{"value":18,"limit":1000000},"postexpandincludesize":{"value":2852,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":2,"limit":100},"expensivefunctioncount":{"value":3,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":1085,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 0.000 1 -total"]},"scribunto":{"limitreport-timeusage":{"value":"0.028","limit":"10.000"},"limitreport-memusage":{"value":908593,"limit":104857600}},"cachereport":{"origin":"mw-web.codfw.main-d8647bfd6-pbmgq","timestamp":"20250221140405","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>