![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Доброго времени суток, коллеги!
Собственно стоит задача написать редактор с подстветкой синтаксиса для языка с контекстно свободной грамматикой. Насколько мне известно существуют два подхода используемых в редакторах и IDE: 1. Полный лексический и синтаксический анализ исходного кода, что дает максимум возможностей для редактора 2. Простой разбор на основе регулярных варащений и т.п. Вопрос заключается в том, какие сердства на сегодняшний день являются наиболее актуальными, при помощи которых можно реализовать данную задачу? Пока что мною рассматриваются варианты: boost::spirit, ANTLR, bison/yacc, писать лексер / парсер вручную. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я недавно разбирался с libclang(думал применить к некоторой задаче), и набрел на такой плагин для vim: https://github.com/Rip-Rip/clang_complete
идея в том, что clang-front-end используется как препроцессор+парсер+база токенов единицы трансляции. этот плагин меня невероятно удивил. он умеет парсить исходники учитывая директивы препроцессора, умеет дополнять все что законно в с++, в том числе и не тривиальные шаблонны, и даже директивы препроцессора. работает невероятно быстро для своей задачи. Добавлено через 1 минуту и 49 секунд libclang собирается под win/linux/mac. Это сообщение отредактировал(а) boostcoder - 12.10.2011, 18:50 |
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Весьма интересно, обязательно взгляну. Но нужен парсер не для С и С++, поэтому вряд ли clang подойдет.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а для каких ЯП? Добавлено @ 18:57 т.е. макросы Добавлено через 10 минут и 51 секунду еще посмотрите на http://www.scintilla.org/ для этого и создавалось. Это сообщение отредактировал(а) boostcoder - 12.10.2011, 18:58 |
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
тогда вам лучше всего подойдет scintilla.
|
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Мне нужен именно парсинг, вопрос был больше по поводу парсинга грамматик для последующей подсветки синтаксиса. Scintilla не подходит. boostcoder, мы отклонились далеко от темы. Давайте работать в обозначенных рамках. При всем уважении, Вы сейчас даете советы не исходя из вопроса. Дополнительные условия я не конкретизировал (ибо расписывать все детали проекта избыточно по моему мнению), но описал направление по которому хотел бы побеседовать. |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Если нужна только подсветка синтаксиса, достаточно выдрать из исходника все ключевые слова и последовательности и должным образом подсветить их. Это уровень лексики, можно воспользоваться регулярными выражениями, сгенерировать лексер или написать его самому. Если ты хочешь интеллектуальное автодополнение и подсветку синтаксических ошибок, это уже уровень синтаксиса языка, а значит регулярки подсасывают. Тут два этапа: лексер и парсер. С первым выше разобрались. Второй опять же можешь делать так, как умеешь: непонятным буст-спиритом, генератором или руками. Естественно полноценный парсинг скорее всего не потребуется, нужно будет реализовать только интересующие тебя моменты. Например для С++, если нас интересует автодополнение, может очень понадобиться адекватный разбор типов и аргументов функций, но, скажем, на корректность записи цикла for можно положить. С другой стороны, если ты хочешь тотально проверять синтаксис, нужно уметь детально вертеть любыми выражениями языка. Если идти дальше, можно даже начать немного понимать семантику и это уже будет не банальная подсветка синтаксических ошибок, а система статического анализа кода. Звучит гордо!)
Немного сумбурно, но как-то так. Если сложно парсить, основная суть где-то в первой половине абзаца)) -------------------- You're face to face With man who sold the world |
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Дак вот и вопрос, что для этого использовать. Серебряной пули не бывает, но мало ли, может у кого-нибудь есть опыт.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
cutwater, для простой подсветки слов, думаю, достаточно просто списка ключевых слов (в крайнем случае регулярок)...
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
-------------------- You're face to face With man who sold the world |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |