Модераторы: Vitalik

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсветка парных скобок, Есть ли такая фича? Как в Delphi 8 
:(
    Опции темы
Vitalik
Дата 29.10.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Coriolis, извини, что не ответил вчера. Сейчас немного не хватает времени... Плюс я немного приболел smile

Цитата(Coriolis @ 28.10.2005, 18:44)
Существуют и переменные с именем оператора.

А что это за язык такой, если не секрет? smile
Можешь также прислать мне свою подсветку для него? Пиши на highlighters[at]gmail.com smile

Цитата(Coriolis @ 28.10.2005, 18:44)
Поэтому возникает ситуация: переменная подсвечивается как оператор.

Гм... А по каким правилам определяется является слово переменной или оператором?..

Цитата(Coriolis @ 28.10.2005, 18:44)
Но вот проблема: код для подсветки парных скобок, который привёл Vitalik, не видет такой скобки. Не могу понять - почему.

А это всё из-за того, что в приведённом алгоритме скобки будут подсвечиваются только если они в тексте являются отдельными лексемами... (или что-то вроде того)
Цитата
var
  ...
  Token: string;
  ...
begin

  ...
  Pos1 := SynEdit.CaretXY;
  SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
  Pos2 := SynEdit.GetMatchingBracketEx(Pos1); // поиск парной скобки
  if (Pos1.char > 1) and (Pos2.char = 0) then begin
    // если не найдена парная скобка
    Dec(Pos1.char); // проверить для предыдущего символа
    SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
    Pos2 := SynEdit.GetMatchingBracketEx(Pos1);
  end;
  ...
 
  if ((Pos2.char = 0) and (Pos2.line = 0)) or SynEdit.SelAvail or (Length(Token) <> 1) then
      Exit;
  Bracket1 := Token[1];
  ...

В принципе можешь удалить эти строчки и проверку... Но тогда получай Bracket1 другим способом...
PM MAIL WWW ICQ YIM   Вверх
Coriolis
Дата 29.10.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Цитата(Vitalik @ 29.10.2005, 21:02)
Coriolis, извини, что не ответил вчера. Сейчас немного не хватает времени... Плюс я немного прибол

Да брось - не за что. Выздоравливай. smile


Цитата(Vitalik @ 29.10.2005, 21:02)
А что это за язык такой, если не секрет?

Язык - M, процедурный, идёт вместе с БД. Интерпретируется, программы хранятся на сервере.
Чё ещё сказать? О! Cashe - это потомок эМа, просто прикрутили (как кто-то сказал - за уши) объекты. А так - cashe тот же эМ.
Конкретно - для СУБД MSM (Micronetic Systems M кажется).

а чем переменные отличаются - это от контекста зависит. Для экономии памяти принято сокращать операторы до одной буквы, напр оператор SET (аналог в васике - LET) - s, GOTO - g, DO (аналог в вdвасике GOSUB) - d.
вот, напр
s s=13
переменной s присваевается значение 13, т.е.
SET s=13
Поэтому если перед и после s стоит пробел - это оператор.
Если после/перед s запятая или скобка - это переменная (например её передали как параметр)
Вот пример кода:
; функция find - чего-то там ищет в файле
find(fstr)
n str,findfl
s findfl=""
f d q:((findfl)!($zc))
.s str=$$read()
.q:str=""
.;s str=$zzup($zzdsp(str,5))
.s:str[fstr findfl=1
q:$zc ""
q str
(табуляция в начале строки, кста -обязат)

Цитата(Vitalik @ 29.10.2005, 21:02)
Можешь также прислать мне свою подсветку для него? Пиши на highlighters[at]gmail.com

Не понял - куда слать?
PM MAIL   Вверх
Vitalik
Дата 29.10.2005, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Coriolis @ 29.10.2005, 21:45)
Для экономии памяти принято сокращать операторы до одной буквы, напр оператор SET (аналог в васике - LET) - s, GOTO - g, DO (аналог в вdвасике GOSUB) - d.

Ничего себе smile Бывает же такое! smile
По-моему читабельность программы от этого сильно падает smile

Цитата(Coriolis @ 29.10.2005, 21:45)
(табуляция в начале строки, кста -обязат)

Это там надо считать, что вместо точек стоит табуляция? smile

Цитата(Coriolis @ 29.10.2005, 21:45)
Не понял - куда слать?

Шли на мыло: highlighters (собачка) gmail.com smile
Или можешь прикрепить здесь к своему сообщению (этот вариант более желателен) smile
PM MAIL WWW ICQ YIM   Вверх
Coriolis
Дата 30.10.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Цитата(Vitalik @ 29.10.2005, 21:56)
Ничего себе  Бывает же такое!

Ага, я тоже так подумал - когда знакомился с языком.
Но это позволяет уменьшить память, т.к. текст интерпретируется.

Цитата(Vitalik @ 29.10.2005, 21:56)
По-моему читабельность программы от этого сильно падает

Да не, быстро привыкаешь и без проблем читаешь исходняк, поверь мне. smile

Цитата(Vitalik @ 29.10.2005, 21:56)
Это там надо считать, что вместо точек стоит табуляция?

Нет-нет, точки - это часть синтаксиса, это аналок {} в сях или begin end в паскале - уровень обозначают. А табуляция - именно #9.

Сейчас прикреплю, но учти - сырой файл, т.к. "в процессе".
Тяяяяк. Не вижу кнопки прикрепит файл. Мож я маленький есчё?
Тада шлю на мыло.
PM MAIL   Вверх
GORI
Дата 31.10.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.10.2005
Где: Ukraine, Kharkov

Репутация: нет
Всего: нет



Если использовать SynPHPSyn1 то все работает, а если SynUni и подгрузить лайтер для PHP то нет.

В чем причина?
PM MAIL WWW ICQ MSN   Вверх
Vitalik
Дата 31.10.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Coriolis @ 30.10.2005, 19:43)
Тяяяяк. Не вижу кнопки прикрепит файл. Мож я маленький есчё?

Эта кнопка должна появляться после предварительного просмотра сообщения smile


Цитата(GORI @ 31.10.2005, 09:44)
Если использовать SynPHPSyn1 то все работает, а если SynUni и подгрузить лайтер для PHP то нет.
В чем причина?

Значится так...
Coriolis и GORI, можете модифицировать код следующим образом:
Цитата
  ... // всё, что выше - оставляем без изменений

  if ((Pos2.char = 0) and (Pos2.line = 0)) or SynEdit.SelAvail {or (Length(Token) <> 1)} then
    Exit;

  Bracket1 := SynEdit.Lines[Pos1.Line-1][Pos1.Char];
  if Bracket1 in BracketSet then begin
    ...

Теперь скобки будут подсвечиваться абсолютно везде, где будут найдены smile
Потому как теперь мы будет отталкиваться не от найденной лексемы (Token), а от реальных симоволов в тексте (Lines) smile
Добавлено @ 17:32
Цитата(Coriolis @ 30.10.2005, 19:43)
Тада шлю на мыло.

Да, письмо получил smile
Когда подсветка будет готова можешь выложить её на сайте www.unihighlighter.com smile
PM MAIL WWW ICQ YIM   Вверх
Coriolis
Дата 31.10.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Ой, не в ту тему написал! сорри.

Это сообщение отредактировал(а) Coriolis - 31.10.2005, 19:22
PM MAIL   Вверх
GORI
Дата 1.11.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.10.2005
Где: Ukraine, Kharkov

Репутация: нет
Всего: нет



Блин smile Ну не работает оно с UniHighlighter... Можете примерчик простенький набросать? чтоб именно с загрузкой лайтера из файла...

smile Виталик самый щедрый на примеры smile smile
PM MAIL WWW ICQ MSN   Вверх
Vitalik
Дата 1.11.2005, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Заказывали примерчик? smile


Присоединённый файл ( Кол-во скачиваний: 38 )
Присоединённый файл  HighlightBrackets.zip 2,89 Kb
PM MAIL WWW ICQ YIM   Вверх
Vitalik
Дата 1.11.2005, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



А вот вместе с EXE smile
(жаль нельзя к одному сообщению несколько файлов прикрепить)

Присоединённый файл ( Кол-во скачиваний: 57 )
Присоединённый файл  HighlightBrackets_exe.zip 370,59 Kb
PM MAIL WWW ICQ YIM   Вверх
Coriolis
Дата 1.11.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



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

Тут мне Snowy указал на глюк: алгоритм подсветки НЕ игнорирует скобки внутри кавычек.
Чего-то не пойму, как это профиксить...
PM MAIL   Вверх
Vitalik
Дата 2.11.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Coriolis @ 1.11.2005, 12:43)
Тут мне Snowy указал на глюк: алгоритм подсветки НЕ игнорирует скобки внутри кавычек.
Чего-то не пойму, как это профиксить...

Гм... Так сходу ничего и получается... smile

Есть как минимум два пути:

1. Переписать метод SynEdit.GetMatchingBracketEx под свои нужды. Например, вставить нужные фильтры. Как то, игнорирование скобок во всех диапазонах или в диапазонах с определёнными именнами или еще что-нить smile

2. Сделать возможность в компоненте задавать свойство StringAttribute (которое объявлено только для чтения у потомка всех подсветок TCustomHighlighter). Просто в реализации метода SynEdit.GetMatchingBracketEx уже есть фильтрация диапазонов строки и комментария. Нужно лишь реализовать возможность в нашем компоненте задавать какие именно диапазоны (а точнее их атрибуты) являются диапазонами "строки" и "комментария" smile
PM MAIL WWW ICQ YIM   Вверх
zvyagaaa
Дата 1.6.2009, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



а можно ли как-то сделать, чтобы парные скобки выделялись бы еще и разными цветами.? Как в экселе в строке формул?
поясню, к примеру (((1/2)*2)-2)

Это сообщение отредактировал(а) zvyagaaa - 1.6.2009, 05:18
PM MAIL   Вверх
Coriolis
Дата 2.6.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Кстати да, крутая штука. 
zvyagaaa, ты если реализовал - поделись пожалуйста)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.2041 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.