Алгоритмы раскраски и автокомплита
От: Ka3a4oK  
Дата: 04.06.10 19:59
Оценка:
Есть простой язык запросов к некой системе, который позволяет создавать запросы типа:

терм1 or терм2 and (терм3 xor [параметр1=значение] or "строковый терм") and  терм4 and [параметр2<значение]...и т.д.

Круглые скобки служат для групировки операци, квадратные — для выделения неких параметров, имеющих название, оператор отношения и значение.
Разбор запроса сделан с помощью библиотеки boost::spirit. Теперь хотелось бы сделать удобный редактор запросов, который бы обладал следующей функциональностью:

1. Динамичная подсветка синтаксиса — те, во время ввода. Выделение ключевых слов (логические операции и названия параметров), парных скобок и т.д.
2. Автокомплит. Например пользователь вводит [, затем букуву, редактор выдает список параметров, начинающихся с введенной буквы. Пользователь вводит вторую букву, список сокращается. Выбрал из списка название парметра, нажал клавишу Интер — параметр дополнился. Далее пользователь вводит оператор отношения(=, !=) — редактор выдает список допустимых
значений для этого оператора.

В идеале хотелось бы использовать уже готовые грамматики спирита. Однако спирит заточен под разбор правильного ввода. Те после ast_parse, он выдает АС-дерево, для начальной подстроки ввода, удовлетворяющей грамматике.
Например, для ввода:
aaa or bbb and ccc

будет построено дерево: OR(aaa AND(bbb ccc)).

Но для незаконченого ввода:
aaa or bbb and

будет построено дерево: OR(aaa bbb).

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

Из готового я нашел: для подсветки — Colorer Library(http://colorer.sourceforge.net/), для подсветки и автокомплита — Scintilla(http://www.scintilla.org/). Если кто имеел опыт, прошу высказаться.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.