Для Python ситуация тривиальна: в стандартной библиотеке есть анализатор Python , а также более высокоуровневый модуль для управления AST .
Кроме того, Python имеет несколько простую грамматику (по крайней мере, если вы используете трюк, чтобы сохранить стек отступов в своем лексере и внедряете фальшивые токены BEGIN
и END
в свой поток токенов, так что вы можете рассматривать Python как простое ключевое слово, похожее на Algol-подобный язык в вашем парсере), поэтому его часто используют в качестве примера грамматики для генераторов парсеров, что означает, что вы можете найти буквально десятки парсеров Python практически для каждого генератора парсера, языка программирования и платформы. там. (Например, вот модуль Haskell, реализующий лексер и анализатор Python .)
Для Ruby доступно довольно много анализаторов.
Ruby невероятно трудно анализировать, поэтому, если вам нужна полная точность, вам в значительной степени придется использовать исходный файл грамматики YACC из реализации YARV Ruby. (parse.y
в исходном каталоге верхнего уровня. ) Парсер JRuby является производным от этого файла, и это единственный из парсеров реализации, который был специально разработан для использования другие клиенты, а не только сам переводчик. (Например, плагин Eclipse RDT, плагин Eclipse DLTK / Ruby, плагин NetBeans Ruby и подсветка синтаксиса jEdit Ruby используют синтаксический анализатор JRuby.) Для этого парсер JRuby фактически был переупакован как отдельный проект .
Конечно, есть клоны YACC практически для каждого языка на планете. Однако следует помнить, что YARV не использует сгенерированный lex
сканер. Он использует рукописный сканер на C, а также грамматика YACC содержит довольно много семантических действий на C. Эти части должны быть повторно реализованы (как они были в JRuby).
Компилятор XRuby является единственной полной реализацией Ruby, которая не использует YARV parse.y
, она использует ANTLRv3 грамматику и ANTLRv3 древовидную грамматику , которые были разработаны с нуля. ANTLR может генерировать парсеры для целого ряда языков, включая, например, Java и C #. Однако его Ruby-сервер остро нуждается в некоторой работе.
RedParse - это синтаксический анализатор Ruby, написанный на Ruby, который утверждает, что способен правильно анализировать весь синтаксис Ruby. Например, он используется в инструменте документации YARD Ruby для извлечения имен методов.
ruby_parser - еще один анализатор Ruby в Ruby. Он генерируется из parse.y
с помощью генератора синтаксических анализаторов racc
, который является частью стандартной библиотеки Ruby.
YARV фактически содержит библиотеку синтаксического анализатора ripper
, которая позволяет вам анализировать код Ruby. К сожалению, он полностью недокументирован, поэтому вам нужно разобраться, прочитав сообщений в блоге . За исключением, конечно, отсутствия документов, почти никто остальное еще не разобрался в этом, и написал в блоге.
Однако для ваших целей вам на самом деле не нужен полноценный парсер Ruby. Вам нужно всего лишь извлечь имена методов и некоторые другие вещи.
RDoc , генератор документации Ruby, содержит синтаксический анализатор Ruby, который может анализировать достаточно Ruby для извлечения имен методов и некоторых других вещей.
Cardinal - это реализация Ruby для Parrot Virtual Machine . Он еще не запускает весь Ruby, но его парсер должен быть достаточно мощным, чтобы поддерживать все, что вам нужно. (Анализатор написан в движке грамматики Parrot, поэтому вам, очевидно, придется запустить его в Parrot, например, написав инструмент отчетности в Perl6.)
tinyrb - еще одна реализация Ruby, которая не запускает полный Ruby, но содержит лучше написанный синтаксический анализатор , чем YARV. В этом случае синтаксический анализатор использует Генератор синтаксического анализатора грамматики синтаксического анализа выражений leg
Иана Пьюмарты .