Який найпотужніший вид парсера?


28

Як побічний проект я пишу мову за допомогою Python. Я почав із використання клону флек / зубрів під назвою Ply, але я стикаюся з ребрами в силу того, що можу виразити за допомогою цього стилю граматики, і мені не цікаво зламати мову через невідповідність імпедансу інструмент. Тому я не проти писати своє.

То який найпотужніший тип парсера? Цитати до статей (а також більше вступних статей) будуть вітатися.

(Я знаю, що "потужний" точно не визначений, але давайте трохи поволі з ним і подивимось, куди йдуть відповіді)


1
Захищений: не рівень досліджень.
Воррен Шуді

3
@Warren: Я перевірив FAQ, перш ніж запитати - це, здається, не є обов'язковою.
Пол Біггар

1
насправді є два FAQ, один для загального сайту та один для CStheory. У CStheory вказується, що питання, на які можна відповісти, наприклад, читаючи Вікіпедію, є поза темою; див. "Які питання є надто елементарними?" в meta.cstheory.stackexchange.com/questions/225/… .
Воррен Шуді

1
@Warren: Ось такі питання я читав. Я читав вікіпедію, але вважав, що це потребує фактичного розуміння.
Пол Біггар

1
Ви маєте на увазі парсери у виробничих чи теоретичних, тобто таких, які охоплюють граматичні типи, крім CFG?
Рафаель

Відповіді:


33

Граматику зазвичай визначають як вільну контекстну граматику - точне визначення дається на сторінці Вікіпедії, але воно працює так само, як і в 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. Подумайте про використання вже існуючої реалізації замість того, щоб писати власну.


1
Відмінна відповідь !! Будь-які думки про те, як вписуються PEG?
Пол Біггар

2
ПЕГ "відрізняються" від CFG: є CFG, які не є PEG, і навпаки. Я посилаюся на вас тут: stackoverflow.com/questions/1857022/… .
Олексій десять Бринк


1
Насправді, найпоширеніші генератори парсера (yacc, Antlr, bison) дозволяють поняттям, що не містять CF, за допомогою предикатів або довільного коду, який перевіряє, чи може бути застосовано одне правило, відповідно. вирішальний пріоритет. Це можна використовувати для реалізації статичної семантики, головним чином, оскільки базовий синтаксис залишається по суті вільним контекстом.
Рафаель

1
Рекурсивні мови - це саме ті мови, які можна вирішити за допомогою завжди зупиняючих машин Тюрінга. Будь-яка контекстно-чутлива мова також є рекурсивною, але оскільки контекстно-чутливі мови визначаються в експоненціальний час, існують рекурсивні мови, які не залежать від контексту. Необмежені граматики ще більш потужні: проблема зупинки може бути описана необмеженою граматикою, але не є рекурсивною мовою.
Олексій десять Брінк

15

Доповідь на ICFP 2010 цього року, Total Parser Combinators , описує бібліотеку комбінаторів парсер-комбінаторів, що перебуває у певній мірі, а також встановлює, що в цій бібліотеці "комбінатори парсерів є максимально виразними", враховуючи, що парсер гарантовано закінчується. На жаль, я не пам’ятаю пояснення, яке автор дав щодо того, що означає «максимально виразний», але, безумовно, це стосується вашого питання про «владу».


1
У мене машина, яка не забруднює, насправді вона і не рухається ... Тож питання: яку мову розбирає ця бібліотека? Не означає, що ця робота, звичайно, не цікава.
бабу

2

Якщо ви хочете вийти за рамки контексту без граматики для розбору мов програмування, але все ж розбираєтесь у поліномічний час, можете вдатися до розбору граммарів виразів або булевих граматик - останні також доступні в LL та LR ароматах (див. Тут ). У формальній теорії мови вивчаються також потужні, але в лінійному часі розпізнавані церковно-розсерєцькі мови , але мені невідомі будь-які реалізовані генератори парсерів для них.

При обробці природною мовою смаки різні, наприклад, розгляд неоднозначності (також: притаманна двозначність), а вільний порядок слів відіграє дуже важливу роль. Тут ключові слова, що м'яко залежать від контексту, і автоматичний перезапуск автомати можуть допомогти вам почати читати.


1
З огляду на те, як було задано питання, та скаргу на те, що МВ занадто обмежує, ваша відповідь очевидно найкраща. Отож іде ...
бабу

0

Інструменти генератора парсеру:

ANTLR дуже хороший. Крім того, ви можете подивитися на JavaCC


Я не є інформатиком (не дивлячись на те, що говорить мій ступінь; Я згоден з Sazzad - ANTLR - це дуже потужний інструмент. Це дуже повно, і я ще не маю жодних проблем з генератором парсера (LL (k), якщо я правильно пам'ятаю). З іншого боку, мені ще належить реалізувати компілятор для дещо складної граматики ...
Jörgen Sigvardsson

5
Я думаю, ви пропускаєте суть питання, а можливо, і весь сайт. Йдеться про теорію розбору, а не про реалізації та інструменти.
Пол Біггар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.