лучший способ выполнить любой синтаксический анализ - это ANTLR . Есть две замечательные книги на эту тему от автора, которые просто необходимы. Окончательный справочник по ANTLR: Создание предметно-ориентированных языков и Шаблоны реализации языка , оба являются бесценными ресурсами. ANTLR может генерировать код обработки на множестве разных языков.
Поскольку вы собираетесь использовать уже написанные грамматики и регулярные выражения, выбор инструмента не имеет значения.
Вы можете использовать flex / bison , и вы найдете много уже написанных грамматик. В противном случае вы можете использовать ANTLR , который должен без проблем работать на C, C ++ и Java, и делать то же самое и для него.
Вы не говорили о том, на каком языке собираетесь использовать эту работу, поэтому предложить лучший подход не так-то просто.
Подумайте о том, что у каждого языка есть свои особенности, например, таблица символов в Ruby строится по-другому, чем в C ++. Это потому, что у вас могут быть более строгие или более свободные декларации и так далее.так что вы должны хорошо подумать, что вам понадобится (и вы также можете объяснить это в своем вопросе, чтобы я мог лучше помочь).
Из ваших двух этапов я могу сказать, что
токенизация довольно проста, не требует различных структур для каждого языка и может быть легко расширена для поддержки множества языков программирования.
Анализ может быть более сложным . Вы должны построить абстрактное синтаксическое дерево программы, а затем делать с ним все, что хотите. Если вам нравится делать это в стиле ООП, вам придется использовать класс для каждого типа узла, но типы узлов могут меняться между языками, потому что они структурно различаются, поэтому делать что-то общее и легко расширяемое на другой язык, это довольно сложно ..
. В этом пункте ANTLR выигрывает у Flex и Bison, потому что он предлагает автоматическую генерацию AST (если я хорошо помню).
Основное различие между этими двумя компиляторами заключается в том, что ANTLR использует парсер LL (k) (то есть сверху вниз), в то время как Bison использует LALR (1) это снизу вверх, но если вы используете уже написанные грамматики, это не должно быть так сложно.
Личный совет: я написал много интерпретаторов или компиляторов, но никогда не начинал с полнофункционального языка. Синтаксис C действительно большой , поэтому, возможно, вам следует начать с подмножества, затем посмотреть, что вы можете делать с токенами и AST, а затем расширить его для поддержки полного синтаксиса.
Дверь, через которую нужно пройти, - это Затмение. Он имеет синтаксический анализ, в том числе устойчивый к ошибкам, для множества языков. Eclipse имеет внутреннюю модульность, которая позволяет использовать эту функциональность, не затрагивая IDE.
Вы не указали язык, поэтому я просто порекомендую этот маленький драгоценный камень, который я нашел на днях:
Он очень прост в использовании и даже имеет предварительные грамматики. -построен для нескольких языков (даже C #). Также существует pyparsing ( http://pyparsing.wikispaces.com/ ), если вы хотите использовать Python в качестве исходного языка.
На каком языке вы пишете свою программу?
Я бы выбрал antlr (а на самом деле я занимаюсь синтаксическим анализом Java). Он поддерживает множество языков, а также содержит множество примеров грамматик, которые вы получаете бесплатно http://www.antlr.org/grammar/list . К сожалению, они не обязательно должны быть идеальными (грамматика Java не имеет правил AST), но они дают вам хорошее начало, и я полагаю, что сообщество разработчиков синтаксического анализатора довольно велико.
Самое замечательное в antlr, помимо множества языковых целей, заключается в том, что LL (*) в сочетании с предикатами, поддерживаемыми antlr, очень эффективен и прост для понимания, как и сгенерированные парсеры.
Под «расширяемым на несколько языков», я полагаю, вы имеете в виду несколько исходных языков. Это непросто, но я полагаю, у вас может быть некоторый успех при их переводе в AST, которые имеют как можно больше общих символов, и написании общего обходчика деревьев, который сможет справиться с различиями в этих языках. Но это могло быть довольно сложно.
Однако имейте в виду, что онлайн-документация будет полезна только после того, как вы прочитаете официальную книгу antlr и поймете LL (*), а также семантические и синтаксические предикаты.