Граматику зазвичай визначають як вільну контекстну граматику - точне визначення дається на сторінці Вікіпедії, але воно працює так само, як і в PLY, що базується на Bison , який, у свою чергу, базується на yacc .
Він каже тут , що PLY використовує LALR аналізатор . Це, по суті, аналізатор LR, в якому стискаються таблиці пошуку, можливо, вводячи конфлікти розбору, зменшуючи деяку виразність граматики LR (тобто, без контекстної граматики, яку може аналізувати LR-аналізатор). Якщо ви хочете знати про обмеження цієї конкретної галузі аналізаторів і тих , інших парсеров, огляд всіх видів розборі методів (LL, LR і ін) даються тут .
Щоб відповісти на ваше запитання: існують алгоритми розбору, здатні розбирати будь-яку без контекстну мову, навіть якщо мова є неоднозначною (тобто існує більше одного способу інтерпретації вводу):
Першим таким алгоритмом був алгоритм CYK , який, на жаль, має час роботи , де - довжина вхідного рядка і- це розмір граматики і тому недоцільний для розбору мов.n | Г |O(n3|G|)n|G|
Другий алгоритм - алгоритм Ерлі . Цей алгоритм також здатний аналізувати будь-яку вільну контекстну граматику. Хоча алгоритм потребує часу для розбору неоднозначної мови, йому потрібен лише час для розбору однозначної мови. Крім того, воно, мабуть, працює в лінійний час для більшості грамматик LR і особливо добре працює на ліво-рекурсивних граматиках.O ( n 2 )O(n3)O(n2)
Тут ви можете знайти статтю, в якій обговорюється практична реалізація (адаптації) алгоритму Ерлі. Вони роблять висновок: "Враховуючи загальність синтаксичного розбору Ерлі порівняно з LALR (1) розбором ((що приблизно відповідає PLY)), і враховуючи, що навіть PEP ((їх реалізація алгоритму Ерлі)) гірший час не буде помітний користувач, це відмінний результат ".
Останній тип аналізатора - парсер GLR . Це узагальнена версія розбору LR, здатна розбирати будь-яку мову, що не стосується контексту.
Зріла реалізація GLR - це ASF + SDF . Bison також може генерувати аналізатор GLR, хоча його реалізації дещо відрізняються від «стандартного» алгоритму GLR. Елкхаунд Алгоритм являє собою гібридний алгоритм РВО / LALR. Він використовує LALR, коли це можливо, і GLR при необхідності, щоб бути одночасно швидким і здатним розбирати будь-яку граматику.
Поза межами вільних граматик є контекстно-чутливі граматики , але вони, як правило, важко проаналізувати і не додають такої виразності: ви можете зробити більше з ними, але для більшості застосунків додаткове використання не має значення, якщо ви не розбираєте природна мова.
Як останній крок - граматики без обмежень . На даний момент граматика закінчена Тьюрінгом, тому не може бути визначено, скільки часу знадобиться для розбору певної мови, що небажано для більшості програм розбору. Зайва потужність майже ніколи не потрібна. Якщо ви хочете використовувати всю цю потужність, доступна мовна машина .
Нарешті, реалізація власного генератора парсера - не дрібниця, зокрема, щоб зробити його швидким. Я особисто закінчив створювати власну версію flex (генератор лексерів), і хоча це здавалося вправою щодо відносно простих алгоритмічних проблем, це стало досить складно, щоб отримати правильне рішення, зокрема, коли я намагався підтримати Unicode. Подумайте про використання вже існуючої реалізації замість того, щоб писати власну.