Каков лучший генератор парсера LALR для C ++, который может генерировать содержательные сообщения об ошибках

Я ищу лучшее решение для генератора парсера LALR для C ++, которое позволит мне создавать действительно хорошие сообщения об ошибках. Я действительно ненавижу синтаксические ошибки, которые генерирует MySQL, и я хочу взять в нем синтаксический анализатор и заменить его средством проверки "lint", которое скажет мне больше, чем просто

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a from users' at line 1

Я использовал YACC / LEX и BISON / FLEX. Он должен работать на Mac или Linux.


person Philip Schlump    schedule 07.12.2009    source источник


Ответы (2)


Зачем вам нужен LALR? Одним из преимуществ парсеров LL (k) является то, что они часто упрощают создание понятных сообщений об ошибках. Большинство грамматик, которые могут быть проанализированы синтаксическим анализатором LALR, можно легко реорганизовать для синтаксического анализа с помощью синтаксического анализатора LL (k).

ANTLR - популярный генератор парсеров LL (k), который может генерировать C ++ (а также ряд других языков ). Из главы 10 The Definitive ANTLR Reference:

Качество сообщений об ошибках и стратегии восстановления языкового приложения часто отличает профессиональное приложение от любительского. Восстановление после ошибки - это процесс восстановления после синтаксической ошибки путем изменения входного потока или использования символов до тех пор, пока синтаксический анализатор не сможет перезапуститься в известном состоянии. Многие созданные вручную и многие распознаватели, не основанные на LL, выдают неоптимальные сообщения об ошибках, тогда как распознаватели, созданные ANTLR, автоматически выдают очень хорошие сообщения об ошибках и разумно восстанавливаются, как показано в этой главе.

Многие грамматики также доступны для ANTLR, включая грамматика MySQL.

person Laurence Gonsalves    schedule 07.12.2009
comment
Хорошее предложение - пойду и посмотрю. Тот факт, что я работал с LALR раньше, не означает, что я должен использовать его сейчас. - person Philip Schlump; 07.12.2009
comment
В порядке. Я пока впечатлен. Я прочитал всю главу 10, и она выглядит многообещающей. - person Philip Schlump; 07.12.2009
comment
Я только что прочитал и не согласен. Ошибка классического программиста, если предположить, что пользователь похож на программиста. В этом случае автор, кажется, думает, что получатель ошибки, то есть человек, создавший ввод, понимает процесс синтаксического анализа. В качестве примера рассмотрим сообщение об ошибке, которое он предлагает для ввода (3;): строка 1: 2 несоответствующий ввод ';' ожидая ')'. Извините, но это не говорит мне почему этого ожидается. Это из-за символа '(' в строке 1: 1, но эта важная информация опущена. - person MSalters; 07.12.2009
comment
Ваш ответ был превосходным. У меня есть рабочий парсер, который делает то, что я хочу - это все еще немного грубо - но мне нужно немного поспать. Я всю ночь работал над этим. - person Philip Schlump; 07.12.2009

Если вы обнаружите, что ANTLR не решает полностью вашу проблему, вы можете рассмотреть возможность использования базилика. Это генератор парсера LR (1), который был разработан и написан для создания парсера C ++.

person Richard Corden    schedule 09.12.2009
comment
Я взгляну на базилик, но у меня уже есть ANTLR, который отлично справляется. - person Philip Schlump; 09.12.2009