Ограничения генераторов грамматики и синтаксического анализатора PEG?

Мне очень понравилось пользоваться YARD:

http://www.ootl.org/yard/

http://code.google.com/p/yardparser/

http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx

Я смог сконструировать полностью функциональный калькулятор. Я оцениваю YARD для парсера PHP. Пожалуйста, сообщите об ограничениях генераторов грамматики и синтаксического анализатора PEG. Большое спасибо!


person Viet    schedule 06.12.2009    source источник
comment
Могу ли я порекомендовать при синтаксическом анализе PHP использовать phc?   -  person Paul Biggar    schedule 24.10.2010


Ответы (2)


Я думаю, что большая «проблема» с PEG заключается в том, что они не вписываются в обычную таксономию грамматик, поскольку работают принципиально другим способом. Нормальные грамматики «обратны» в том смысле, что они описывают все возможные предложения (программы), которые могут быть сгенерированы. PEG описывают, как разбирать - они подходят к проблеме с другого конца.

На мой взгляд, это более естественный способ думать о проблеме, и, конечно же, для любого рукописного (рекурсивного спуска) синтаксического анализатора я бы больше ничего не делал.

person DrPizza    schedule 06.12.2009
comment
спасибо DrPizza! Я читал, что PEG не может анализировать Python и C ++ в контекстно-зависимых частях. Не уверен, что это правда. Я пытаюсь написать синтаксический анализатор PHP и обнаружил, что решения PEG очень просты по сравнению с этими Bison / Yacc. - person Viet; 07.12.2009
comment
Большинство синтаксических анализаторов не могут правильно обрабатывать контекстно-зависимые грамматики без каких-либо хаков (например, для синтаксического анализа C вы заставляете синтаксический анализатор возвращаться в лексер, чтобы он назначал правильный тип символа для имен типов, чтобы они не получали рассматриваются как обычные идентификаторы). PEG интересны тем, что они могут напрямую выражать правила устранения неоднозначности, которые используют C и C ++ (я не знаю о Python). В частности, если это похоже на декларацию, так оно и есть. Они могут сделать это, упорядочив свои правила так, чтобы правило объявления проверялось перед правилом утверждения. - person DrPizza; 07.12.2009
comment
Тем не менее, я не знаю, могут ли PEG обрабатывать всю грамматику C ++ или Python; Я не пробовал. - person DrPizza; 07.12.2009
comment
Правила упорядочивания не помогают, если смысл синтаксического анализа определяется другой информацией. С ++ позорно допускает x y; как утверждение с двумя интерпретациями: объявление или арифметическая операция. Никакой порядок правил не поможет вам решить, что это такое. Вам нужна контекстная информация. Парсеры C и C ++ часто взламывают это, строя таблицу символов по ходу работы; знание того, что x является типом, решает проблему. Но если определение x или y появляется * после оператора, даже этот прием не работает. Безопасная ставка - это парсеры GLR, которые просто выбирают оба синтаксических анализа для последующего разрешения. - person Ira Baxter; 08.12.2009
comment
+1 Хороший пример Ира! Итак, я прихожу к выводу, что PEG не подходят / не оптимальны для синтаксического анализа C / C ++. А как насчет использования его для PHP? - person Viet; 09.12.2009
comment
Ах да, конечно. Решение, как всегда, состоит в том, чтобы действия были связаны с правилами; Фреймворк синтаксического анализатора Boost Spirit2 использует PEG в качестве базовой модели, и я считаю, что он допускает подходящие действия - каждое успешное объявление типа должно добавлять свои идентификаторы в таблицу имен типов. В сочетании с упорядочиванием PEG (правила объявления пробуются перед правилами выражения) PEG будет поступать правильно. К сожалению, источник Spirit2 - это обычная непонятная вещь, которую мы ожидаем от Boost. - person DrPizza; 09.12.2009
comment
Настоящая ценность PEG, кстати, заключается в разработке ваших собственных языков; использование PEG гарантирует, что язык однозначно поддается синтаксическому анализу, а не традиционный подход к языковому дизайну, который заключается в том, чтобы либо не заботиться о синтаксическом анализе (и придумать отвратительные синтаксисы, такие как C и C ++), либо разработать синтаксис, а затем бить его до тех пор, пока в конечном итоге он становится чем-то, что ваш инструмент (традиционно yacc) действительно может анализировать. Выполняя синтаксический анализ основных операций (а не генерацию предложений), PEG значительно упрощают этот аспект проектирования языка. - person DrPizza; 09.12.2009
comment
(однако добавление семантических действий, обновляющих таблицу имен типов, вызывает проблему, если вы хотите запоминать свои результаты, как это делается при синтаксическом анализе Packrat) - person DrPizza; 09.12.2009
comment
Вы не должны разрабатывать свой язык на основе технологии синтаксического анализа, если только вы не настаиваете на том, что ваш язык никогда не будет развиваться, или вы не настаиваете на том, чтобы любая эволюция использовала ту же технологию синтаксического анализа. Это ставит телегу впереди лошади. При разработке языка вы хотите добиться выразительности и удобочитаемости. Ребята, занимающиеся компилятором, могут немного пострадать от этого (я один из них), но их не так много, и, по-видимому, много пользователей языка . Оптимизируйте для них, а не для разработчиков компиляторов (или, что еще хуже, просто для парсеров). - person Ira Baxter; 14.08.2014
comment
Отмечу, что часть вопроса о генераторах парсеров в целом никто не рассматривал. - person Ira Baxter; 14.08.2014

Основное ограничение грамматик PEG заключается в том, что они вообще не имеют дело с двусмысленностью.

Безусловно, в этом их сила, поскольку работа с двусмысленностями - одна из самых неприятных частей использования инструмента CFG (контекстно-свободной грамматики).

С помощью PEG вы решаете двусмысленность явно, упорядочивая правило, которое вы хотите сопоставить, перед другим правилом, которое будет соответствовать неоднозначно, но которое вам не нужно.

Проблема в том, что вы даже не всегда знаете о некоторых или даже о каких-либо неоднозначностях в языке или грамматике, и генераторы PEG, по крайней мере, те, которые я пробовал, не анализируют грамматику на двусмысленность, чтобы помочь вам найти их, а затем разработать и упорядочить свои правила, чтобы правильно с ними справляться.

Генераторы парсеров CFG, такие как yacc и bison, анализируют вашу грамматику и сообщают обо всех неоднозначностях. К сожалению, они часто сообщают о них довольно загадочно, что бывает трудно понять. И, конечно, часто бывает трудно исправить грамматику, чтобы справиться с ними. Но по крайней мере вы будете знать, что они существуют.

С грамматикой PEG вы можете блаженно игнорировать двусмысленности в своей концептуальной грамматике, потому что, как только вы сделаете ее PEG, в ней больше не будет двусмысленностей, у нее просто будут правила соответствия и, возможно, молчаливо недостижимые правила, которые также совпадали бы, если бы у них были более высокие приоритет. Они могут не отображаться при тестировании, но могут появиться после выпуска.

С грамматиками CFG вы вынуждены иметь дело с двусмысленностями во время разработки, но это будет нелегко.


Если я не уточняю, вот обсуждение Джошуа Хабермана шестилетней давности в блоге по языкам программирования Lambda the Ultimate: PEG и Packrat Parsing не подходят.

person hippietrail    schedule 14.08.2014
comment
как только вы сделаете это PEG, в нем больше не будет двусмысленностей. Верно, вы можете принять то, что PEG навязывает вам (это предпочтительнее этого), как ответ. Но во многих случаях, особенно для поддержки выразительности, лучше, чтобы язык был неоднозначным и разрешал эту неоднозначность, используя неконтекстную информацию из кода. Хотя я не буду утверждать, что неоднозначности, присущие C ++ повсюду, обязательно полезны, если вы переключитесь на GLR, вы также можете блаженно игнорировать двусмысленность в процессе синтаксического анализа. (Выполняет ли PEG произвольный просмотр вперед?) См. stackoverflow.com/a/1004737/120163 - person Ira Baxter; 14.08.2014
comment
Я также не уверен, что PEG будет выполнять произвольный просмотр вперед. - person Ira Baxter; 14.08.2014
comment
Я только начал играть с PEG несколько дней назад, так что я не эксперт, но я был почти уверен, что они произвольно смотрят вперед, что на самом деле является еще одной вещью, которую я видел, как люди выбирали еще один знак против них. Я тоже искал инструмент GLR для JavaScript, но не нашел ни одного аналога PEG.js и Jison. - person hippietrail; 14.08.2014
comment
@IraBaxter, какую технику синтаксического анализа вы рекомендуете? - person CMCDragonkai; 17.07.2015
comment
У меня был очень хороший опыт работы с GLR. См. Мой ответ на Quora: qr.ae/RRQctF - person Ira Baxter; 17.07.2015