Ограничения генераторов грамматики и парсера PEG? - PullRequest
13 голосов
/ 07 декабря 2009

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

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 07 декабря 2009

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

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

5 голосов
/ 14 августа 2014

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

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

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

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

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

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

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


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

...