2015-12-23 1 views
0

Я в процессе написания редактора кода для пользовательского языка. Мы используем ANTLR для lexer и parser и CodeMirror для рамки редактора (работает в браузере).Редактор кода с использованием ANTLR

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

Что я нахожу, так это то, что пользователь часто находится в середине редактирования чего-либо, поэтому анализатор ANTLR не очень полезен, так как текущий входной поток не полностью анализируется (и часто приводит ANTLR к неправильному пути из-за неполный входной поток).

Поэтому я использую поток токенов, чтобы выяснить, что происходит, и попытаться предоставить контекстно-зависимую помощь.

Мне интересно, может ли кто-нибудь помочь в использовании ANTLR в качестве части редактора кода. Я на правильном пути, используя поток токенов вместо дерева синтаксического анализа?

Можно ли использовать ANTLR API для выполнения таких задач, как поиск маркеров для определения общего контекста того, что пользователь в настоящее время редактирует?

Извините, если это что-то неясно. Просто начните работу над этим проектом. :-)

Спасибо за любую помощь.

+0

Я считаю, что автор ANTLR давно дал понять, что он не предназначен для этого сценария. Вам, вероятно, нужно написать ручную структуру компилятора, чтобы справиться с этим, как и любая другая среда IDE. –

+0

См. Http://stackoverflow.com/questions/19738439/is-it-feasible-to-use-antlr-for-source-code-completion –

+0

Хорошо, спасибо за отзыв и ссылку! – RedTailedHawk

ответ

1

Я нахожу ANTRL отлично подходящим для проверки синтаксиса и легкого поиска информации для действительного ввода. Однако для завершения кода у вас есть другой сценарий. Как вы уже выяснили, парсер часто может не дает вам хороший ответ, потому что вход недействителен во время ввода пользователем. Барт связался с ответом, где Сэм описал, что он реализовал большое решение с использованием ANTLR 4, но, к сожалению, не описывает, как это сделать.

Но даже если вы можете получить парсер, чтобы дать вам набор ожидаемых токенов, что вы собираетесь делать из этого? Что вы хотите показать, если, скажем, ожидается идентификатор? Это может быть что угодно, как член класса, имя var и т. Д. Я не верю, что это ответ, поэтому я разработал собственное решение, которое я описываю здесь: Universal Code Completion using ANTLR. Это для ANTLR 3, но, безусловно, можно сделать работу с 4.

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

+0

Спасибо, Майк, я читаю вашу ссылку. Я ценю помощь! – RedTailedHawk