Хочу разочаровать еще одних кремлевских мечтателей. Реализация универсального интелисенса невозможна, так как в интелисенсе главное не клавиатурные шпионы или диковенные окна, а банальные парсеры языков. Сложность их разработки — это главный астонавливающий фактор. Так что для решения описанной задачи на высоком техническом уровне начать нужно с гениального построителя пасреров сопособного по грамматике из описания языка быстренько составить эффективный пасрер. Таких продуктов в в свободном доступе я не видел.
Более того многие языки так сожны в парсинге (С++, естественные языки) или имеют такие особености (Смолток), что уневирсально решить такую задачу нельзя.
Ну, а окошки и шпионы имеются в любой среде вроде Студии или ИДЕИ.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Хочу разочаровать еще одних кремлевских мечтателей.
Думаю, реализация идеи не настолько сложна, как может показаться на первый взгляд. Вопрос лишь в том, насколько "крут" будет такой интеллисенс (меня порадовал бы даже просто IntelliType, то есть автодополнение). Простое автодополнение — это вообще просто и уже сделано, кстати: IntelliComplete, но за деньги Хотелось бы иметь подобный проект, но открытый (свободный) + несколько более функциональный.
Согласен, что автодополнение после точки сделать несколько сложнее, но уверен, что возможно. А вообще, по этой ссылке по-моему, достаточно аргументов сказано по поводу осуществимости...
Кстати, не понял, а зачем вообще парсить естественные языки? Вышеупомянутый шароварный IntelliComplete имеет словарь для русского (!) языка, который работает очень даже здорово.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Silvester, Вы писали:
S>>Есть вот такая идея: S>>http://forum.script-coding.info/topic.php?topic=68 S>>Требуются энтузиасты
VD>Хочу разочаровать еще одних кремлевских мечтателей. Реализация универсального интелисенса невозможна, так как в интелисенсе главное не клавиатурные шпионы или диковенные окна, а банальные парсеры языков. Сложность их разработки — это главный астонавливающий фактор. Так что для решения описанной задачи на высоком техническом уровне начать нужно с гениального построителя пасреров сопособного по грамматике из описания языка быстренько составить эффективный пасрер. Таких продуктов в в свободном доступе я не видел.
VD>Более того многие языки так сожны в парсинге (С++, естественные языки) или имеют такие особености (Смолток), что уневирсально решить такую задачу нельзя.
VD>Ну, а окошки и шпионы имеются в любой среде вроде Студии или ИДЕИ.
Привет.
Вообщето парсинг левосторонней грамматики- тривиальная задача, тоесть один раз пишешь, а потом подкидываешь правила и радуешься. Собственно, на основе даной грамматики можно(даже нужно) строить работу автокомплита ала live templates. Было бы не плохо составить юзе-кейс диаграмму, отображающую то, чего все-таки хоцца, тогда и будет смысл говорить (Влад, это к тебе — сюда было бы не плохо иметь возможность ложить хоть графику — проффесиональнее).
Здравствуйте, Damat, Вы писали:
D>...Было бы не плохо составить юзе-кейс диаграмму, отображающую то, чего все-таки хоцца, тогда и будет смысл говорить...
Может, что-то типа техзадания написать и опубликовать? Я мог бы попробовать.
Здравствуйте, Silvester, Вы писали:
S>Здравствуйте, Damat, Вы писали:
D>>...Было бы не плохо составить юзе-кейс диаграмму, отображающую то, чего все-таки хоцца, тогда и будет смысл говорить...
S>Может, что-то типа техзадания написать и опубликовать? Я мог бы попробовать.
Вообще задачка прикольная, глядя на то, что етсь требования и к скорости, и к функционалу...
Но думать можно начинать тогда, когда четко очерчен объем работ, его же можно и обсудить итеративно
Даного рода задачки прикольные тем, что организация даных принимает вид дерева, что способствует рассматривать
возможные варианты выбора из контекста, в котором ты находишься — типа, сначала неймспейс и ничего другого,
внытри него — классы, структуры, интерфейсы.
Моя идея — как это все задавать — взять за МЕТАФОРУ обычный XSD файл — очень схоже
Но там в основном все статическое, здесь же понадобится абстрагтроваться(выделять интерфейсы).
По крайней мере XML сериализатор, умеющий сохранять и загружать объекты с интерфейсными свойствами у меня уже есть
А еще чего не хватало, например. Рисуеш ты в Визио(ужас!!!) диаграмму последовательности, а на ней тоже нужен интелисенс, такого я покачто не видел. Тоетсь в нашем случае не стоит привязываться к текстовому представлению кода, можна от него абстрагироваться — это как вью
В общем, поучиться есть чему, не уверен, что это реально стартанет, да и стартовать ему нельзя до проработки архитектуры в ЮМЛ — сдесь — СТРУКТУРА — ГЛАВНОЕ
D>Вообщето парсинг левосторонней грамматики- тривиальная задача, тоесть один раз пишешь, а потом подкидываешь правила и радуешься. Собственно, на основе даной грамматики можно(даже нужно) строить работу автокомплита ала live templates. Было бы не плохо составить юзе-кейс диаграмму, отображающую то, чего все-таки хоцца, тогда и будет смысл говорить
На словах все просто. Создай хотя бы один парсер для современного языка тогда поговорим. К тому же парсер для комплита еще должен уметь жить в условиях когда в коде куча ошибок.
D>(Влад, это к тебе — сюда было бы не плохо иметь возможность ложить хоть графику — проффесиональнее).
Клади ее в список своих файлов и давай ссылку. У каждого зарегестрированного посетителя форума в профиле есть список файлов который можно пополнять. Жмешь на свой ник в правом верхнем углу. Жмешь на ссылку "Файлы" и вперед...
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Silvester, Вы писали:
S>Здравствуйте, VladD2, Вы писали:
VD>>Хочу разочаровать еще одних кремлевских мечтателей.
S>Думаю, реализация идеи не настолько сложна, как может показаться на первый взгляд. Вопрос лишь в том, насколько "крут" будет такой интеллисенс (меня порадовал бы даже просто IntelliType, то есть автодополнение). Простое автодополнение — это вообще просто и уже сделано, кстати: IntelliComplete, но за деньги Хотелось бы иметь подобный проект, но открытый (свободный) + несколько более функциональный.
Автодополнение по заранее готовому списку и делать нечего. Это работа на день для любого толкового программиста. А автодополнение для языков программирования требует наличия нехилого парсера для каждого из них... Собственно я уже повторяюсь.
S>Согласен, что автодополнение после точки сделать несколько сложнее, но уверен, что возможно.
Что там быть уверенным? Конечно возможно. Почти любая уважающая себя IDE это делает. Правда, хорошо это удается сделать только для модульных языков хорошо подготовленных для парсинга. Например, нормального автодополнения для С++ я пока что вообще не видел. Везде глюки. Ну, да не о том речь. Создание таких парсерво архи сложный процесс.
S>А вообще, по этой ссылке по-моему, достаточно аргументов сказано по поводу осуществимости...
Извини, но это не серьезно.
S>Кстати, не понял, а зачем вообще парсить естественные языки? Вышеупомянутый шароварный IntelliComplete имеет словарь для русского (!) языка, который работает очень даже здорово.
Комплит по славорю сделать не трудно. В прочем как и не особо нужно. Вот ради хохмы ракропал простенький комплит для текстбокса. В нем конечно половина всего не реализовано, и вообще поделка наколеночная, но за то убил на это дело пол часа всего (C# 2.0):
using System;
using System.Drawing;
using System.Windows.Forms;
public class MainForm : Form
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MainForm());
}
TextBox _textBox = new TextBox();
ComboBox _comboBox = new ComboBox();
public MainForm()
{
Text = "Пример реализации автодополнения.";
_textBox.Dock = DockStyle.Fill;
_textBox.Multiline = true;
_textBox.KeyDown += textBox1_KeyDown;
_comboBox.DropDownWidth = 200;
_comboBox.DropDownHeight = 150;
_comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
_comboBox.SelectionChangeCommitted += _comboBox_SelectionChangeCommitted;
_comboBox.DropDownClosed += _comboBox_DropDownClosed;
string[] words = @"Мама мыла раму Папу дядю вообще все это фигня".Split(' ');
Array.Sort(words);
_comboBox.Items.AddRange(words);
_comboBox.Visible = false;
Controls.AddRange(new Control[]{_textBox, _comboBox});
}
void ShowComboBox(Point location)
{
_comboBox.Size = new Size(0, 0);
_comboBox.Visible = true;
_comboBox.Focus();
_comboBox.Location = location;
_comboBox.DroppedDown = true;
}
static bool IsIdent(char ch) { return char.IsLetterOrDigit(ch) || ch == '_'; }
Point PickUpWord()
{
string text = _textBox.Text;
int start = _textBox.SelectionStart - 1;
for (; start >= 0 && IsIdent(text[start]); start--)
;
int end = ++start;
for (; end < text.Length && IsIdent(text[end]); end++)
;
return new Point(start, end);
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.Space)
{
int chPos = _textBox.SelectionStart >= _textBox.Text.Length
? _textBox.SelectionStart - 1 : _textBox.SelectionStart;
Point pos = PointToClient(_textBox.PointToScreen(
_textBox.GetPositionFromCharIndex(chPos)));
ShowComboBox(pos);
Point txtLoc = PickUpWord();
string word = _textBox.Text.Substring(txtLoc.X, txtLoc.Y - txtLoc.X);
_textBox.SelectionStart = txtLoc.X;
int index = _comboBox.FindString(word);
if (index >= 0)
_comboBox.SelectedIndex = index;
e.SuppressKeyPress = true;
}
}
private void _comboBox_DropDownClosed(object sender, EventArgs e)
{
_comboBox.Visible = false;
}
private void _comboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
Point txtLoc = PickUpWord();
_textBox.SelectionStart = txtLoc.X;
_textBox.SelectionLength = txtLoc.Y - txtLoc.X;
_textBox.SelectedText = (string)_comboBox.SelectedItem;
}
}
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
согласен, что не просто, но интересен тот факт, он и есть факт, что ошибка внешнего контекста обрывает парсинг внутрености, по крайней мере так часто бывает, что при исправлении в коде 1-й потом начинают вылазить уже другие.
Вообще-то, реализация даной штуковины должна быть — элегантный рекурсивный алгоритм и красиво заданная грамматика.
Ну там еще контексты, всякие правила...
Смысл даного проэкта(я так думаю) — это реализация его не в коде, а в диаграммах, проработка понятной и расширяемой архитектуры без единого кусочка жвачки
Есть смысл придумать еще одно колесо — подарок своему самолюбию
Здравствуйте, Damat, Вы писали:
D>согласен, что не просто, но интересен тот факт, он и есть факт, что ошибка внешнего контекста обрывает парсинг внутрености, по крайней мере так часто бывает, что при исправлении в коде 1-й потом начинают вылазить уже другие.
На то есть целая теория о востановлении после сбоя. Для языков типа С зачастую просто пропускают лексемы пока не найдут ключевую, например, ";".
D>Вообще-то, реализация даной штуковины должна быть — элегантный рекурсивный алгоритм и красиво заданная грамматика.
Рекурсивный алгоритм == LL(1) парсеру. Или LL(k) — если с откатами. К сожалению большинство языков с не являются LL(k) и приходится то и дело вставлять ручные заглядывания в перед на непоределенное "к". В итоге код получается страшненьким. И вообще для таких задач нужно использовать построители парсеров.
Вопрос в том, что даже с построителями парсеров задача не становится тривильной и остается огромной для многих ЯП.
D>Смысл даного проэкта(я так думаю) — это реализация его не в коде, а в диаграммах, проработка понятной и расширяемой архитектуры без единого кусочка жвачки
А расширяемую архитектуру чего нужно описывать? Выподающего списка? Дык я тебе его на коленке за день сварганю. А расширяемый парсер — это уже задача небуручка. Вон Мамут очень правильно ссылку дал: Re: Универсальный механизм Intellisense (идея)
D>Есть смысл придумать еще одно колесо — подарок своему самолюбию
Могу только еще раз повторить, что задача создания интерфейса для автодополнения не стоит и выеденного яйца, а задача создания универсального парсера жрущего удобную граматику слишком сложна и сама по себе может потешить любое самолюбие.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Могу только еще раз повторить, что задача создания интерфейса для автодополнения не стоит и выеденного яйца, а задача создания универсального парсера жрущего удобную граматику слишком сложна и сама по себе может потешить любое самолюбие.
Думаю парсером не отделаться, как минимум нужна типизация. Скорее решение всех задачь фазы анализа при трансляции.
При реализации автодополнения во Флоре поступил очень просто: транслирую до нужной позиции, смотрю состояние стека времени трансляции, и по верхнему элементу делаю автодополнения.
Для естественных языков предлагаю в автодополнении ввести режимы ХОРЕЙ и ЯМБ
Здравствуйте, Lever, Вы писали:
L>Думаю парсером не отделаться, как минимум нужна типизация. Скорее решение всех задачь фазы анализа при трансляции.
Парсер — это общее название. Конечно для комплита нужно делать парсер с семантическим анализом.
L>При реализации автодополнения во Флоре поступил очень просто: транслирую до нужной позиции, смотрю состояние стека времени трансляции, и по верхнему элементу делаю автодополнения.
А если код не корректный? Ктому же не все языки можно транслироват частично. Например в C# обявления не обязаны быть перед исползованием. Так что нужно практически полностью скомпилровать проект, чтобы заработало автодополение.
L>Для естественных языков предлагаю в автодополнении ввести режимы ХОРЕЙ и ЯМБ
... << RSDN@Home 1.2.0 alpha rev. 631>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Парсер — это общее название. Конечно для комплита нужно делать парсер с семантическим анализом.
L>>При реализации автодополнения во Флоре поступил очень просто: транслирую до нужной позиции, смотрю состояние стека времени трансляции, и по верхнему элементу делаю автодополнения.
VD>А если код не корректный? Ктому же не все языки можно транслироват частично. Например в C# обявления не обязаны быть перед исползованием. Так что нужно практически полностью скомпилровать проект, чтобы заработало автодополение.
А еще есть хитрые синтаксические сахара и подсказки для компилятора — от define'ов в С/С++ до import в java до using в C# до compile(export_all), export([myfun/2, myfun/3, myfun2/0]), behavior(gen_server), import в Эрланге
Здравствуйте, VladD2, Вы писали:
VD>А если код не корректный?
Облом. VD>Ктому же не все языки можно транслироват частично. Например в C# обявления не обязаны быть перед исползованием.
Поэтому приветтствуется разбиение на части partial и есть связка CodeUnit <-> текст. VD>Так что нужно практически полностью скомпилровать проект, чтобы заработало автодополение.
А нужно ли оно тогда будет
В данной теме я с Вами полностью согласен. Меня просто удивили наивные попытки требования такой универсальности.
Здравствуйте, Lever, Вы писали:
L>Поэтому приветтствуется разбиение на части partial и есть связка CodeUnit <-> текст.
Не. Я к тому, что парсер для автодополнения должен быть круче чем просто парсер компилятора. Должна быть возможность его локального применения и он должен лучше переносить ошибки в коде. Насколько я знаю те же ДжетБрэйновцы парся Шарп сначала по скобкам обнаруживают функцию, а потом перепарсивают только ее. Это дает возможность быстро обновлять изменения и при этом забивать на многоие ошибки.
VD>>Так что нужно практически полностью скомпилровать проект, чтобы заработало автодополение. L>А нужно ли оно тогда будет
Как видишь, от ДжетБрэйновской ИДЕИ и РеШарпера многие писают кипятком. Так что точно нужно.
L>В данной теме я с Вами полностью согласен. Меня просто удивили наивные попытки требования такой универсальности.
Да, нет. Требования то очень хорошие. Вот только действительно слишком наивные. Люди даже не понимают где реальные сложности. Они думают, что сложно создать механизм комплита. А тем временем основаная сложность это парсеры и логика их точечного применения.
... << RSDN@Home 1.2.0 alpha rev. 631>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Универсальный механизм Intellisense (идея)
Здравствуйте, VladD2, Вы писали:
VD>Как видишь, от ДжетБрэйновской ИДЕИ и РеШарпера многие писают кипятком. Так что точно нужно.
Что за звери: ДжетБрэйновская ИДЕЯ и РеШарпер?
Если порусски РеШарпер это R#? L>>В данной теме я с Вами полностью согласен. Меня просто удивили наивные попытки требования такой универсальности. VD>Да, нет. Требования то очень хорошие. Вот только действительно слишком наивные.
Я упор делал на наивность.
Re[11]: Универсальный механизм Intellisense (идея)
Здравствуйте, Lever, Вы писали:
L>Здравствуйте, VladD2, Вы писали:
VD>>Как видишь, от ДжетБрэйновской ИДЕИ и РеШарпера многие писают кипятком. Так что точно нужно. L>Что за звери: ДжетБрэйновская ИДЕЯ и РеШарпер?
Вот понаблюдал еще немножко — набралось аргументов.
Вообщето механизм автодополнения можна делать вообще без парсинга — тк парсинг — это уже разбор представления
синтаксического дерева в текстовом редакторе. Если отбросить все это(пока, зачем париться над логикой свыше),
то можна определить четкий механизм автодополнения — предлагаем от контекста — поиск к корню дерева, хотя и не всегда, но это меня не сильно расстраивает — возможно.
Потом подойдем к отображеню дерева в текст и обратно — сдесь сложнее, но уже попроще, чем париться об этом сразу.
уже сдесь при готовой функциональности определения валидности синтаксического дерева легче реализовывать, тк
решение о правильности — реализовано в библиотеке.
для каждого елемента реализовываются операции превращения в строку и парсинга (интерпритатор)
вообще — отличная задача чтобы использовать практически все паттерны(основные).
Вообще парсить можна по-разному — признаки — парность скобок и т п.
А варианты с заглядыванием наперед — не про SQL запрос ли спрашивалось
Грамматика должна быть по максимуму правильной, иначе — вручную реализован механизм парсинга.
Насчет наивности — не верю. Если это уже реализовали, то и я смогу, многое считал в свое время заоблачным, а потом чик — и реализовал.
Если не забегать наперед, то все сложное становится простым — проэктировать надо правильно!!!