C ++ GLR парсеры с бизоном - PullRequest
       38

C ++ GLR парсеры с бизоном

5 голосов
/ 16 декабря 2011

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

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

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

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

1 голос
/ 30 октября 2012

Я не знаю, что вы подразумеваете под "%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
0 голосов
/ 15 июня 2019

У меня такая же проблема.Вещи, которые я выучил - Bison возвращают 1, если не в состоянии генерировать новый вывод.Вопрос: почему?Поскольку я отключил варианты C ++ (%define api.value.type variant), это не поддерживается GLR в Bison, но я забуду о %define api.token.constructor.И Бизон без промедления просто сломается.

Удачи в устранении неполадок.

...