Фундаментальные вопросы по Intellisense
От: gakysei  
Дата: 24.05.10 19:09
Оценка:
Есть некий язык и есть задача — сделать для него удобный intellisense.
Поисследовав тему возникло несколько вопросов:
1. Определение контекстов. При наборе текста должна вылезать подсказка только с теми выражениями или переменными, которые доступны в текущем контексте. Как хранить эти контексты не совсем понятно.
2. Необходимо выводить подсказку на синтаксически не верные выражения. Проблема в том, что парсер обламывается раньше, чем дойдет до нужного места. Это пожалуй самая сложная проблема.

Если есть какая-нибудь литература по теме, буду благодарен.
intellisense
Re: Фундаментальные вопросы по Intellisense
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.05.10 19:24
Оценка:
Здравствуйте, gakysei, Вы писали:

G>Есть некий язык и есть задача — сделать для него удобный intellisense.


Язык программирования?

G>Поисследовав тему возникло несколько вопросов:

G>1. Определение контекстов. При наборе текста должна вылезать подсказка только с теми выражениями или переменными, которые доступны в текущем контексте. Как хранить эти контексты не совсем понятно.

Что такое контекст в твоем понимании свершено не понятно.
А вообще, схема примерно одинаковая. Должен быть некий движок который быстренько типизирует выражение, получает по нему информацию о типах, в полученной информации по местоположению находит нужные элементы и далее уже делает то что нужно пользователю.

G>2. Необходимо выводить подсказку на синтаксически не верные выражения. Проблема в том, что парсер обламывается раньше, чем дойдет до нужного места. Это пожалуй самая сложная проблема.


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

Я когда стал компилятора Nemerle приспосабливать под нужды движка интеллисенса, то очень долго его дорабатывал. И все равно не все замечательно. По сути нужно или разрабатывать компилятор сразу с учетом нужд интеллисенса, или создавать отдельный движок (так сделано в Решарпере и интеграциях к MS VS C#/VB от самой же MS.

G>Если есть какая-нибудь литература по теме, буду благодарен.


Ну, по этому вопросу литературы просто нет в принципе. Можно только поглядеть на код подобных движков для других языков. На тот же Nemerle в частности. Есть еще интеграция к IronPython-у (поставляется с VS SDK).
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Фундаментальные вопросы по Intellisense
От: batu Украина  
Дата: 25.05.10 05:51
Оценка:
Здравствуйте, gakysei, Вы писали:

G>Есть некий язык и есть задача — сделать для него удобный intellisense.

G>Поисследовав тему возникло несколько вопросов:
G>1. Определение контекстов. При наборе текста должна вылезать подсказка только с теми выражениями или переменными, которые доступны в текущем контексте. Как хранить эти контексты не совсем понятно.
Вообще описание синтаксиса и есть подсказка на допустимые конструкции. Вопрос только как единообразно оттуда получить подсказки.
G>2. Необходимо выводить подсказку на синтаксически не верные выражения. Проблема в том, что парсер обламывается раньше, чем дойдет до нужного места. Это пожалуй самая сложная проблема.
Подсказку на не верные это не правильный подход. Достаточно обнаружить ошибку, и предложить правильные (допустимые конструкции). Обламывание парсера это плохо. После обнаружения ошибки разбор должен продолжаться. Для этого надо (опять таки единообразно) сформулировать начало-конец синтаксической конструкции, для того что бы при обнаружении ошибки парсер продолжил анализировать следующую конструкцию. У себя вот тем "единообразным" принял объект, и все легло на свои места.
Замечание. Синтаксическая конструкция тоже формирует объект. Во всяком случае в моей терминологии и в моем подходе.

G>Если есть какая-нибудь литература по теме, буду благодарен.

Есть упоминание об этих проблемах при построении компиляторов. Единого решения нет, так как нет единого подхода. Есть еще вопросы с формулированием ошибок. Как я решил эту проблему,я уже писал. Все есть объект с единым форматом, и описание синтаксиса с тем же пожходом и синтаксисом что и вся система и язык. Т.е. все единое целое.
Тогда описание "понятия"-тоже объект (формат же единый) и из него можно вытащить все, что необходимо не только для трансляции, подсказок и формулирования ошибки, но и переход к разбору следующего объекта при обнаружении ошибки.
Кстати, формулирование ошибки у меня можно посмотреть как в списке, так и деревом. Т.е. просмотреть всю ветку разбора которая привела к ошибке. Причем делается это легко. При обнаружении ошибки, она формулируется в терминах объекта-понятия (той конструкции грамматики. У нее ж есть и класс и имя и хелп.) Как только ветка заканчивается без ошибок, то и последовательность ошибок обнуляется. Получается все ошибки в ветке если она не правильно разобрана сохраняется. Ну, и затем переход к поиску следующего объекта.. Синтаксис стандартный.. Обычно запоминают ключевые слова в качестве реперных точек для продолжения работы транслятора, у меня же описание каждого объекта начинается с имени класса. Так что запоминать практически нечего.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.