Ограничения генераторов грамматики и парсера 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. Большое вам спасибо!
Ответы
Ответ 1
Я думаю, что большая "проблема" с PEG заключается в том, что они не вписываются в обычную таксономию грамматик, поскольку они действуют принципиально иным способом. Нормальные грамматики "назад" в том смысле, что они описывают все возможные предложения (программы), которые могут быть сгенерированы. PEGs описывают, как анализировать - они приходят к проблеме с другого конца.
На мой взгляд, это более естественный способ подумать о проблеме, и, конечно же, для любого написанного вручную (рекурсивного спуска) анализатора я бы ничего не сделал.
Ответ 2
Основное ограничение грамматики ПЭГ заключается в том, что они вообще не имеют проблемы с двусмысленностью.
Конечно, это также их сила, так как работа с двусмысленностями - одна из самых разочаровывающих частей использования инструмента CFG (контекстная свободная грамматика).
С помощью PEG вы имеете дело с двусмысленностями явно, заказывая правило, которое вы хотите сопоставить, перед другим правилом, которое будет соответствовать неоднозначно, но которое вам не нужно.
Проблема заключается в том, что вы не всегда знаете о какой-либо или даже какой-либо двусмысленности на языке или грамматике и генераторах ПЭГ, по крайней мере, те, которые я пробовал, не анализируют грамматику для двусмысленности помогите вам найти их, а затем спроектировать и упорядочить свои правила, чтобы иметь дело с ними правильно.
Генераторы парсеров CFG, такие как yacc и bison, анализируют вашу грамматику и сообщают обо всех двусмысленностях. К сожалению, они часто сообщают о них довольно загадочно, что может быть трудно понять. И, конечно, часто трудно установить грамматику, чтобы справиться с ними. Но, по крайней мере, вы будете знать, что они существуют.
С грамматикой ПЭГ вы можете быть блаженно не осведомлены о двусмысленностях в вашей концептуальной грамматике, потому что, как только вы сделаете ее ПЭГ, она больше не имеет двусмысленностей, она имеет только соответствующие правила и, возможно, молчащие недостижимые правила, которые также соответствовали бы они имели более высокий приоритет. Они могут не отображаться в вашем тестировании, но могут появиться после выпуска.
С CFG-грамматиками вы вынуждены заниматься двусмысленностями во время разработки, но это будет нелегко.
В случае, если я не объясню, здесь шестилетняя дискуссия Джошуа Хабермана на блоге языков Lambda the Ultimate: PEGs и Packrat Parsing не являются ответом.