Контекстная подсветка

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Вот же блин...

Post by jdigreze »

Напиши парсер "в лоб". Если нужно сделать подсветку ключевых слов и/или мнемоник, думаю ничего сложного, а с учётом производительности современных компов, работать будет не сильно тормознуто.
Конечно, если задумывать интеллектуальный парсер, который будет еще и разбором синтаксиса на правильность заниматься, то это геморройно.
И еще не получится заморачивайся комментариями в стиле /* ... */ - банально не сможешь остледить, если начало и конец за экраном. Хотя комментарии в стиле // можно и попробовать сделать, хотя думаю что ни к чему.
Тоже кстати относится к подсветке слов, если экран не в начале строки.

Для начала нужна будет функция например UCase (или LCase, кому как удобнее), читаешь символы с экрана в буфер, обрабатываешь этой функцией.

Потом еще функция типа IsChar - проверка буква ли это.
Потом цикл по строкам (str-номер строки), внутри него поиск слов в строке в стиле:
flag=0
col=1
beg=0
do {
If flag=0 {
// до сего момента буквы небыло
if IsChar(d(str,col))=true { flag=1; beg=col; } //если символ есть буква, то взведем флаг и запомним начальную позицию
} else {
// была на предыдущих шагах
if IsChar(d(str,col)=false {
flag=0;
if FoundInDict(beg,str)=true { BrushDisp(beg,str) }; // если символ не буква, то ищем в словаре, и если найден, то красим.
}
col++
} wile col<80

Вот как-то так. Писал "по ходу пьессы", потому ни_на_каком языке приближенным к Ц, но общий ход мыслей наверно понятен. Реализацию функции предлагаю в качестве домашнего задания. ;)
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Вот же блин...

Post by Lavr »

jdigreze wrote:Напиши парсер "в лоб". Если нужно сделать подсветку ключевых слов и/или мнемоник, думаю ничего сложного, а с учётом производительности современных компов, работать будет не сильно тормознуто.
...
Вот как-то так. Писал "по ходу пьессы", потому ни_на_каком языке приближенным к Ц, но общий ход мыслей наверно понятен. Реализацию функции предлагаю в качестве домашнего задания. ;)
Да я вобщем-то представляю как писАть парсеры, и смею заверить, что
вполне успешно с этим справлялся в задачах транслирования на язык
ассемблера... :wink:
Просто хотелось сэкономить время и удачно соединить свою наработку
с тем, что, возможно, у кого-то в заделе есть.
Смею заверить, что будь у меня такой готовый продукт, я бы не стал
ему делать здесь рекламу - с ДОС-программами мало кто работает.
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Написать будет быстрее, чем удачно соединяться с чужим кодом ;)
Например брат моей бывшей жены ещё будучи школьником написал
для RW1 редкатор с подсветкой синтаксиса с нуля всего за несколько дней:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Написать будет быстрее, ...
Да - ты прав, я уже и сам понял, что написать гораздо быстрее,
чем читать ненужные советы и оффтоп реплики...
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Написать будет быстрее, чем удачно соединяться с чужим кодом ;)
Например брат моей бывшей жены ещё будучи школьником написал
для RW1 редкатор с подсветкой синтаксиса с нуля всего за несколько дней:

Image
Вот - нашёл сырцы класса, которым подсветка собственно и осуществлялась:

Code: Select all

// Part of Robot Warfare 1 Source Code Editor

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define RW1_WORDS  60
#define RW1_LUM    10
#define RW1_SIMBOL 20

#ifndef RGB
#define RGB(r,g,b) ((r<<16)|(g<<8)|b)
#endif

#define LUCOM   RGB(200,0,0)
#define LUPRE   RGB(200,100,0)
#define LUREG   RGB(120,30,0)
#define LUREM   RGB(0,255,0)
#define LUIMG   RGB(150,0,150)
#define LUQUO   RGB(0,50,255)
#define LUNUM   RGB(0,0,190)

typedef char LUWORD[16];
typedef char LUCOMM[8];

struct lumin
{
  int quan_w,quan_l,quan_s;

  LUWORD *words;               //  выделение
  long *wordscolor;            //  слов

  LUCOMM *beg_lum;              //  начало выделения
  LUCOMM *end_lum;              //  конец выделения
  int cur_lum;                 //  текущее выделение
  long *lumcolor;

  char *simbol;                //  выделение отдельных
  long *simbolcolor;           //  символов
  long rgb;
  int curw,curl,curs;

  lumin() //unsigned int w,int l,int s)
  {
    // (RW1_WORDS,RW1_LUM,RW1_SIMBOL);

    cur_lum = -1;
    quan_w = RW1_WORDS;
    quan_l = RW1_LUM;
    quan_s = RW1_SIMBOL;

    words = new LUWORD[quan_w];
    wordscolor = new long[quan_w];

    beg_lum = new LUCOMM[quan_l];
    end_lum = new LUCOMM[quan_l];
    lumcolor = new long[quan_l];

    simbol = new char[quan_s];
    simbolcolor = new long[quan_s];

    rgb = RGB(0,0,0);
    curw = curl = curs = 0;
  }

 ~lumin()
  {
    delete[] words;
    delete wordscolor;
    delete[] beg_lum;
    delete[] end_lum;
    delete lumcolor;
    delete simbol;
    delete simbolcolor;
  }

  void setRGB(int r, int g, int b)
  {
    rgb = RGB(r,g,b);
  }

  void set_color(long col)
  {
    rgb = col;
  }

  int add_word(char *s)
  {
    if(curw>=quan_w-1) return -1;
    strncpy(words[curw],s,15);
    words[curw][15] = 0;
    wordscolor[curw] = rgb;
    return ++curw;
  }

  int add_lum(char *s1,char *s2)
  {
    if(curl>=quan_l-1) return -1;
    strncpy(beg_lum[curl],s1,7);
    beg_lum[curl][7] = 0;
    strncpy(end_lum[curl],s1,7);
    end_lum[curl][7] = 0;
    lumcolor[curl] = rgb;
    return ++curl;
  }

  int add_symb(char s)
  {
    if(curs>=quan_s-1) return -1;
    simbol[curs] = s;
    simbolcolor[curs] = rgb;
    return ++curs;
  }

  void freeze(void)
  {
    quan_w = curw;
    quan_l = curl;
    quan_s = curs;
  }

};

lumin rw1;

long check_simbol(char c)
{
  static int k;
  c=toupper(c);
  for(k=0;k<rw1.quan_s;k++)
   if(rw1.simbol[k]==c)
     return rw1.simbolcolor[k];
  return 0;
}

long check_word(char *c)
{
  static char ccc[255];
  static int k;
  static char *po;
  strcpy(ccc,c);
  if((po=strchr(ccc,' '))!=NULL) *po=0;
  if((po=strchr(ccc,'('))!=NULL) *po=0;
  for(k=0;k<(int)strlen(ccc);k++) ccc[k]=toupper(ccc[k]);
  for(k=0;k<rw1.quan_w;k++)
   if(!strcmp(ccc,rw1.words[k]))
     return rw1.wordscolor[k];
  return 0;
}

int check_beg_lum(char c1,char c2)
{
  static int k;
  for(k=0;k<rw1.quan_l;k++)
  {
    if(rw1.beg_lum[k][0]==c1&&
       (rw1.beg_lum[k][1]==0||rw1.beg_lum[k][1]==c2))
      return k;
  }
  return -1;
}

int check_end_lum(char c1,char c2)
{
  static int k;
  for(k=0;k<rw1.quan_l;k++)
  {
    if(( rw1.end_lum[k][0]==c1&&
         (rw1.end_lum[k][1]==0||rw1.end_lum[k][1]==c2) )||
       (c2==0&&rw1.end_lum[k][0]==0))
      return -1;
  }
  return rw1.cur_lum;
}

void InitLumines(void)
{
  rw1.set_color(LUCOM);
  rw1.add_word("ACT");
  rw1.add_word("CALL");
  rw1.add_word("COMMAND");
  rw1.add_word("COPYP");
  rw1.add_word("DUMP");
  rw1.add_word("GOTO");
  rw1.add_word("IFY");
  rw1.add_word("IFN");
  rw1.add_word("LEFT");
  rw1.add_word("NOP");
  rw1.add_word("POP");
  rw1.add_word("RADAR");
  rw1.add_word("RECV");
  rw1.add_word("RECVP");
  rw1.add_word("RET");
  rw1.add_word("RIGHT");
  rw1.add_word("SAY");
  rw1.add_word("SEND");
  rw1.add_word("SENDP");
  rw1.add_word("SHOT");
  rw1.add_word("SPY");
  rw1.add_word("STEP");
  rw1.add_word("TEST");
  rw1.add_word("DEF");
  rw1.add_word("FRONT");
  rw1.add_word("BACK");
  rw1.add_word("END");

  rw1.set_color(LUIMG);
  rw1.add_word("COLOR");
  rw1.add_word("FILL");
  rw1.add_word("PIXEL");
  rw1.add_word("PLANE");
  rw1.add_word("SELECT");
  rw1.add_word("SET");
  rw1.add_word("TEXT");

  rw1.set_color(LUPRE);
  rw1.add_word("IF");
  rw1.add_word("ELSE");
  rw1.add_word("WHILE");
  rw1.add_word("DO");
  rw1.add_word("FOR");
  rw1.add_word("BREAK");
  rw1.add_word("CONTINUE");

  rw1.set_color(LUREG);
  rw1.add_word("X");
  rw1.add_word("Y");
  rw1.add_word("D"); 
  rw1.add_word("N");
  rw1.add_word("K"); 
  rw1.add_word("R");
  rw1.add_word("T");
  rw1.add_word("E");
  rw1.add_word("M");
  rw1.add_word("I");
  rw1.add_word("A");
  rw1.add_word("B");
  rw1.add_word("C");
  rw1.add_word("P");
  rw1.add_word("L");
  rw1.add_word("S");

  rw1.set_color(LUNUM);
  rw1.add_symb('0');
  rw1.add_symb('1');
  rw1.add_symb('2');
  rw1.add_symb('3');
  rw1.add_symb('4');
  rw1.add_symb('5');
  rw1.add_symb('6');
  rw1.add_symb('7');
  rw1.add_symb('8');
  rw1.add_symb('9');
  rw1.add_symb('(');
  rw1.add_symb(')');

  rw1.set_color(LUPRE);
  rw1.add_symb('{');
  rw1.add_symb('}');
  rw1.add_symb('@');

  rw1.set_color(LUREM);
  rw1.add_lum("% ","\n");
  rw1.add_lum(" %","\n");
  rw1.add_lum("//","\n");

  rw1.set_color(LUIMG);
  rw1.add_lum("IMAGE","\n");

  rw1.set_color(LUQUO);
  rw1.add_lum(""",""");
  rw1.add_lum("'","'");

  rw1.freeze();
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Спасибо Shaos! Попробую заюзать...

По сравнению с Colorer и Colorizer - твой код хотя бы
обозрим взглядом...

Кстати говоря, если для кого представляет интерес - исходники Colorer и Colorizer
я могу выложить - я что-то несколько лет не сподобился их использовать...
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Я поступал проще - проходил по строке, брал фрагмент между разделителями, вычислял CRC и искал её в таблице, если находил - брал цвет. Была ещё пара исключений типа префиксов "0x", "#" и еще чего-то.
Extreme Entertainment
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Mac Buster wrote:Я поступал проще - проходил по строке, брал фрагмент между разделителями, вычислял CRC и искал её в таблице, если находил - брал цвет.
А КЦК как считал - как в РК, или сеьёзный CRC ?
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Нужно же некое подобие хэша. CRC тут мало подходит, хотя в небольшом количестве вариантов вполне пригодно.
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

маленький хэш имеет большую вероятность коллизий (в данном случае ошибочная подсветка), а большой хэш долго считается, так что наверное бинарный поиск по словарю отсортированных в алфавитном порядке слов - наиболее оптимальный по скорости и надёжности подход (вышеприведённый пример не оптимален - там просто идёт тупой перебор от начала до конца словаря - и это приемлимо работало на Pentium-60, который медленнее чем 486DX4)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Lavr wrote:А КЦК как считал - как в РК, или сеьёзный CRC ?
Я взял чью-то быструю реализацию, CRC16 кажется.
Extreme Entertainment
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Mac Buster wrote:
Lavr wrote:А КЦК как считал - как в РК, или сеьёзный CRC ?
Я взял чью-то быструю реализацию, CRC16 кажется.
Если уже в CRC32 на коллизии можно нарваться (я нарывался), то в CRC16 и подавно - в результате могут быть подсвечены слова, никакого отношения не имеющие к словарю...
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Обычно, одному значению хеша соответствует несколько элементов, поэтому после выборки списка элементов по таблице делают точное сравнение элементов.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

b2m wrote:Обычно, одному значению хеша соответствует несколько элементов, поэтому после выборки списка элементов по таблице делают точное сравнение элементов.
тогда можно выбрать очень быстрый хэш - первая буква слова ;)

в любом случае перебор так или иначе остаётся...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Shaos wrote:тогда можно выбрать очень быстрый хэш - первая буква слова ;)

в любом случае перебор так или иначе остаётся...
Гражданка (не помню какой страны) Харпер предложила при формировании мнемоники команды брать первую и 4-ю букву слова-команды. Вроде бы многие этому предложению и следовали. Так что брать некую выборку из мнемоники имеет смысл.
Extreme Entertainment