Кіріспе
Компьютерлік бағдарламалау және компьютерлік ғылымда "максималды жұту" немесе "ең ұзақ сәйкестік" қағидасы, қандай да бір құрылымды жасағанда, қолжетімді кірістің мүмкіндігінше көп бөлігін пайдалануды білдіреді. Бұл терминді алғаш рет R. G. G. Cattell компиляторлар үшін код генераторларын автоматты түрде тудыру туралы докторлық диссертациясында қолданған.
In computer programming and computer science, "maximal munch" or "longest match" is the principle that when creating some construct, as much of the available input as possible should be consumed. The earliest known use of this term is by R. G. G. Cattell in his PhD thesis on automatic derivation of code generators for compilers.
Қолдану
Мысалы, көптеген бағдарламалау тілдерінің лексикалық синтаксисі токендерді кіріс ағынынан мүмкін болатын ең көптеген таңбалардан құрастыруды қажет етеді. Бұл [a z]+ (бір немесе бірнеше кіші әріп) сияқты, кеңінен қолданылатын тұрақты өрнектердегі туа біткен екіұштылық мәселесін шешу үшін жасалады. Бұл термин компиляторларда нұсқауды таңдау кезеңінде "плитка салу" әдісін сипаттау үшін де қолданылады – аралық тілде бағдарламаны бейнелейтін құрылымдық ағашты сызықтық машиналық кодқа қалай түрлендіру керектігін анықтау. Ағаштың толық кіші бөлігі бір машиналық нұсқауға айналуы мүмкін, ал мәселе – ағашты бір-біріне қабаттаспайтын "плиткаларға" бөлу, олардың әрқайсысы бір машиналық нұсқауды көрсетеді. Тиімді стратегия – кез келген сәтте мүмкін болатын ең үлкен кіші ағаштың плиткасын жасау, бұл "максималды жұту" деп аталады.
Кемшіліктері
Кейбір жағдайларда "максималды жұту" қанағаттандырмас немесе түсініксіз нәтижелерге алып келеді. Мысалы, C бағдарламалау тілінде x=y/*z; (ешқандай бос орынсыз) жазбасы, синтаксистік қатеге себеп болуы мүмкін, себебі /* таңбалар тізбегі (көзінде жоқ) кейінірек, тікелей байланысы жоқ нақты түсіндірменің */ аяқталу белгісімен аяқталған немесе аяқталмаған түсіндірмені бастайды (C-дегі түсіндірмелер ішкі түсіндірмелерді қолдамайды). Бұл жазбаның мақсаты – y мәнін z көрсеткішінің мәніне бөлу нәтижесін x айнымалысына тағайындау еді; мұндай код жарамды болар еді. Бұл бос орынды пайдалану арқылы немесе x=y/(*z); арқылы көрсетілуі мүмкін. Тағы бір мысал, C++ тілінде, шаблонды мамандандыру синтаксисінде < және > «бұрыштық жақшалар» таңбаларын қолданады, бірақ екі тізбектелген > таңбалары оңға жылдыру операторы >> ретінде түсіндіріледі. C++11 нұсқасына дейін келесі код талдау қатесін тудыратын еді, себебі оңға жылдыру операторының белгісі екі тік бұрыштық жақша белгісінің орнына кездеседі: std::vector<std::vector<int>> my mat 11; //C++03-те қате, C++11-де дұрыс. std::vector<std::vector<int> > my mat 03; //C++03 немесе C++11 тілінде дұрыс. 2011 жылдың тамызында қабылданған C++11 стандарты грамматиканы оңға жылдыру белгісін (Java-дағыдай) тік бұрыштық жақшалар жұбымен теңдестіретіндей етіп өзгертіп, грамматиканы күрделендірді, бірақ максималды жұту принципін қолдануға мүмкіндік берді. Шаблондарда <:: тізбегі пайда болуы мүмкін болғандықтан, ең көп мөлшерде жұту ережесіне ерекшелік қосу қажет болды. Мұндай жағдайда, егер тізбекке : немесе > белгісі еріп келмесе, < белгісі <:: белгісінің бөлігі ретінде емес, жеке < белгісі ретінде түсіндіріледі.
std::vector<std::vector<int>> my mat 11; //Incorrect in C++03, correct in C++11. std::vector<std::vector<int> > my mat 03; //Correct in either C++03 or C++11. The C++11 standard adopted in August 2011 amended the grammar so that a right shift token is accepted as synonymous with a pair of right angle brackets (as in Java), which complicates the grammar but allows the continued use of the maximal munch principle. An exception to the maximal munch rule had to be added anyway to deal with the sequence <:: which can appear in templates. In that case, unless the sequence is followed by : or > the character < is interpreted as its own token instead of part of the token <:.
Баламалар
Бағдарламалау тілдерін зерттеушілер де максмалды мунч принципін басқа лексикалық түсініктілікті жою тактикаларымен алмастыруға немесе толықтыруға жауап берді. Бір тәсіл – "кейінге шектеулерді" пайдалану, яғни ең ұзын сәйкестікті тікелей таңдаудың орнына жарамды сәйкестіктен кейін келетін таңбаларға шектеу қою. Мысалы, [a z]+ үлгісіне сәйкес келетін тізбектерден кейін әліпбилік таңба келмейді деп ереже қойса, бұл осы реттегі өрнек үшін максмалды мунч принципімен бірдей нәтиже береді. (Реттегі өрнектер контекстінде максмалды мунч принципі "ашкөздік" деп аталады және "жалқаулыққа" қарама-қарсы қойылады.) Тағы бір тәсіл – максмалды мунч принципін сақтап, оны басқа принципке, мысалы, контекстке бағындыру (мысалы, Java-дағы оңға жылдыру операторы, жалпылама өрнектер контекстінде синтаксистік жарамсыздыққа байланысты сәйкес келмейді).