Лучший способ маркировать и проанализировать языки программирования в моем [закрытом] приложении

6
задан ChrisDiRulli 12 February 2010 в 15:32
поделиться

5 ответов

лучший способ выполнить любой синтаксический анализ - это ANTLR . Есть две замечательные книги на эту тему от автора, которые просто необходимы. Окончательный справочник по ANTLR: Создание предметно-ориентированных языков и Шаблоны реализации языка , оба являются бесценными ресурсами. ANTLR может генерировать код обработки на множестве разных языков.

7
ответ дан 9 December 2019 в 22:33
поделиться

Поскольку вы собираетесь использовать уже написанные грамматики и регулярные выражения, выбор инструмента не имеет значения.

Вы можете использовать flex / bison , и вы найдете много уже написанных грамматик. В противном случае вы можете использовать ANTLR , который должен без проблем работать на C, C ++ и Java, и делать то же самое и для него.

Вы не говорили о том, на каком языке собираетесь использовать эту работу, поэтому предложить лучший подход не так-то просто.

Подумайте о том, что у каждого языка есть свои особенности, например, таблица символов в Ruby строится по-другому, чем в C ++. Это потому, что у вас могут быть более строгие или более свободные декларации и так далее.так что вы должны хорошо подумать, что вам понадобится (и вы также можете объяснить это в своем вопросе, чтобы я мог лучше помочь).

Из ваших двух этапов я могу сказать, что

  • токенизация довольно проста, не требует различных структур для каждого языка и может быть легко расширена для поддержки множества языков программирования.

  • Анализ может быть более сложным . Вы должны построить абстрактное синтаксическое дерево программы, а затем делать с ним все, что хотите. Если вам нравится делать это в стиле ООП, вам придется использовать класс для каждого типа узла, но типы узлов могут меняться между языками, потому что они структурно различаются, поэтому делать что-то общее и легко расширяемое на другой язык, это довольно сложно ..

. В этом пункте ANTLR выигрывает у Flex и Bison, потому что он предлагает автоматическую генерацию AST (если я хорошо помню).

Основное различие между этими двумя компиляторами заключается в том, что ANTLR использует парсер LL (k) (то есть сверху вниз), в то время как Bison использует LALR (1) это снизу вверх, но если вы используете уже написанные грамматики, это не должно быть так сложно.

Личный совет: я написал много интерпретаторов или компиляторов, но никогда не начинал с полнофункционального языка. Синтаксис C действительно большой , поэтому, возможно, вам следует начать с подмножества, затем посмотреть, что вы можете делать с токенами и AST, а затем расширить его для поддержки полного синтаксиса.

3
ответ дан 9 December 2019 в 22:33
поделиться

Дверь, через которую нужно пройти, - это Затмение. Он имеет синтаксический анализ, в том числе устойчивый к ошибкам, для множества языков. Eclipse имеет внутреннюю модульность, которая позволяет использовать эту функциональность, не затрагивая IDE.

-2
ответ дан 9 December 2019 в 22:33
поделиться

Вы не указали язык, поэтому я просто порекомендую этот маленький драгоценный камень, который я нашел на днях:

http://irony.codeplex.com/

Он очень прост в использовании и даже имеет предварительные грамматики. -построен для нескольких языков (даже C #). Также существует pyparsing ( http://pyparsing.wikispaces.com/ ), если вы хотите использовать Python в качестве исходного языка.

1
ответ дан 9 December 2019 в 22:33
поделиться

На каком языке вы пишете свою программу?

Я бы выбрал antlr (а на самом деле я занимаюсь синтаксическим анализом Java). Он поддерживает множество языков, а также содержит множество примеров грамматик, которые вы получаете бесплатно http://www.antlr.org/grammar/list . К сожалению, они не обязательно должны быть идеальными (грамматика Java не имеет правил AST), но они дают вам хорошее начало, и я полагаю, что сообщество разработчиков синтаксического анализатора довольно велико.

Самое замечательное в antlr, помимо множества языковых целей, заключается в том, что LL (*) в сочетании с предикатами, поддерживаемыми antlr, очень эффективен и прост для понимания, как и сгенерированные парсеры.

Под «расширяемым на несколько языков», я полагаю, вы имеете в виду несколько исходных языков. Это непросто, но я полагаю, у вас может быть некоторый успех при их переводе в AST, которые имеют как можно больше общих символов, и написании общего обходчика деревьев, который сможет справиться с различиями в этих языках. Но это могло быть довольно сложно.

Однако имейте в виду, что онлайн-документация будет полезна только после того, как вы прочитаете официальную книгу antlr и поймете LL (*), а также семантические и синтаксические предикаты.

2
ответ дан 9 December 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: