Резюме: самый короткий, вероятно, Antlr.
Соблазнительно пойти в Книгу Дракона, чтобы узнать о теории разбора. Но я не думаю, что Книга Дракона, и у вас есть одно и то же представление о том, что означает «теория» Книга Дракона описывает, как создавать рукописные парсеры, генераторы парсеров и т. Д., Но вы почти наверняка захотите использовать инструмент генерации парсеров.
Несколько человек предложили Bison и Flex (или их более старые версии Yacc и Lex).
Это старые приверженцы, но они не очень полезны.
Их документация сама по себе не плохая, просто она не совсем помогает разобраться с случайной сложностью их использования.
Их внутренние данные плохо инкапсулированы, и с ними очень сложно что-либо сделать. Например, в phc у нас все еще нет правильных номеров строк, потому что это очень сложно. Они поправились, когда мы изменили грамматику, включив в нее операторы «без операции», но это невероятный взлом, который не должен быть необходим.
Якобы, Bison и Flex работают вместе, но интерфейс неудобен. Хуже того, существует множество версий каждой из них, которые прекрасно работают только с некоторыми конкретными версиями другой. И, наконец, я, по крайней мере, проверил, документация о том, какие версии пошли, а какая была довольно скудной.
Написание синтаксического анализатора рекурсивного спуска просто, но может быть утомительным. Antlr может сделать это для вас, и это, кажется, довольно хороший набор инструментов, с тем преимуществом, что то, что вы изучаете в этом проекте, может быть применено ко многим другим языкам и платформам (Antlr очень переносим). Есть также много существующих грамматик для изучения.
Непонятно, на каком языке вы работаете, но некоторые языки имеют отличные рамки синтаксического анализа. В частности, библиотека Haskell Parsec выглядит очень элегантно. Если вы используете C ++, у вас может возникнуть соблазн использовать Spirit . Мне было очень легко начать, и трудно - но все же возможно - делать с ним сложные вещи. Это соответствует моему опыту C ++ в целом. Я говорю, что мне было легко начать, но тогда я уже написал пару парсеров и изучал синтаксический анализ в классе компилятора.
Короче говоря: Antlr, если только у вас нет веских причин.