2011-12-15 2 views
5

Я использую Bison для генерации парсера. У меня есть конфликт смены/сокращения, когда мне действительно нужно, чтобы Bison использовал GLR, а не LALR, чтобы справиться с этим. Но я передал директиву %glr-parser, и исходный файл все еще утверждает, что это парсер LALR. Я даже нашел скелет «glr.cc», который предполагает, что он является парсером GLR C++ и с его использованием %skeleton "glr.cc" не изменил результат. Разве Bison не отправляет все алгоритмы для всех целевых языков?C++ GLR-анализаторы с Bison

+0

bison - бесплатное программное обеспечение, поэтому вы можете изучать и улучшать его код soruce. Кстати, вы считали использование другого генератора синтаксического анализатора, например ANTLR? –

+1

@Basile: Моя грамматика не LL. Что касается улучшения исходного кода, вы имеете в виду, если бы я хотел грузовик через шесть миллиардов вспомогательных утилит. – Puppy

+0

ANTLR имеет несколько хаков, чтобы иметь дело с некоторыми видами не LL-грамматик. –

ответ

1

Вам нужно всего лишь %glr-parser, чтобы получить парсер GLR. Обратите внимание, что синтаксические анализаторы GLR могут STILL иметь конфликты (сдвиг/уменьшение или уменьшение/уменьшение), а именно то, что созданный парсер будет пытаться использовать обе альтернативы и унифицировать результат.

Если вы хотите закрыть сообщения о конфликтах, вы можете использовать %expect и %expect-rr. Ховер, просто слепо используя анализатор GLR, где вы не понимаете, что все конфликты являются опасными, результирующий анализатор может экспоненциально долго анализировать некоторые входы, если вы не будете осторожны, или можете дать вам ошибки двусмысленности во время выполнения.

+0

Это не ответит на вопрос: я сказал, что пытался «% glr-parser» – Puppy

+0

@DeadMG: тогда у вас есть парсер GLR. Просто так, что парнеры GLR имеют одинаковые сдвиги/сокращения и уменьшают/уменьшают конфликты как партизаны LALR, они просто разбираются с ними по-другому. –

+0

Я не сказал, что у меня его нет, потому что он все еще сообщал о конфликтах, я сказал, что у меня все еще есть один, потому что комментарии исходного файла все еще были указаны. – Puppy

1

Я не знаю, что вы подразумеваете под «%skeleton "glr.cc" не изменил выход», потому что он делает! Вы уверены, что действительно восстановили выход? Если вы это сделали, предоставьте более подробную информацию.

$ echo "%% exp: '0'" > /tmp/f.y 
$ bison -S lalr1.cc /tmp/f.y -o f1.cc 
$ bison -S glr.cc /tmp/f.y -o f2.cc 
$ ls -l f1.cc f2.cc 
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc 
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc