Основное ограничение грамматик PEG заключается в том, что они вообще не имеют дело с двусмысленностью.
Безусловно, в этом их сила, поскольку работа с двусмысленностями - одна из самых неприятных частей использования инструмента CFG (контекстно-свободной грамматики).
С помощью PEG вы решаете двусмысленность явно, упорядочивая правило, которое вы хотите сопоставить, перед другим правилом, которое будет соответствовать неоднозначно, но которое вам не нужно.
Проблема в том, что вы даже не всегда знаете о некоторых или даже о каких-либо неоднозначностях в языке или грамматике, и генераторы PEG, по крайней мере, те, которые я пробовал, не анализируют грамматику на двусмысленность, чтобы помочь вам найти их, а затем разработать и упорядочить свои правила, чтобы правильно с ними справляться.
Генераторы парсеров CFG, такие как yacc и bison, анализируют вашу грамматику и сообщают обо всех неоднозначностях. К сожалению, они часто сообщают о них довольно загадочно, что бывает трудно понять. И, конечно, часто бывает трудно исправить грамматику, чтобы справиться с ними. Но по крайней мере вы будете знать, что они существуют.
С грамматикой PEG вы можете блаженно игнорировать двусмысленности в своей концептуальной грамматике, потому что, как только вы сделаете ее PEG, в ней больше не будет двусмысленностей, у нее просто будут правила соответствия и, возможно, молчаливо недостижимые правила, которые также совпадали бы, если бы у них были более высокие приоритет. Они могут не отображаться при тестировании, но могут появиться после выпуска.
С грамматиками CFG вы вынуждены иметь дело с двусмысленностями во время разработки, но это будет нелегко.
Если я не уточняю, вот обсуждение Джошуа Хабермана шестилетней давности в блоге по языкам программирования Lambda the Ultimate: PEG и Packrat Parsing не подходят.
person
hippietrail
schedule
14.08.2014