nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 15:44



Reply to topic  [ 30 posts ]  Go to page Previous  1, 2
Контекстная подсветка 
Author Message
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Напиши парсер "в лоб". Если нужно сделать подсветку ключевых слов и/или мнемоник, думаю ничего сложного, а с учётом производительности современных компов, работать будет не сильно тормознуто.
Конечно, если задумывать интеллектуальный парсер, который будет еще и разбором синтаксиса на правильность заниматься, то это геморройно.
И еще не получится заморачивайся комментариями в стиле /* ... */ - банально не сможешь остледить, если начало и конец за экраном. Хотя комментарии в стиле // можно и попробовать сделать, хотя думаю что ни к чему.
Тоже кстати относится к подсветке слов, если экран не в начале строки.

Для начала нужна будет функция например 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

Вот как-то так. Писал "по ходу пьессы", потому ни_на_каком языке приближенным к Ц, но общий ход мыслей наверно понятен. Реализацию функции предлагаю в качестве домашнего задания. ;)


04 Jul 2011 05:04
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
jdigreze wrote:
Напиши парсер "в лоб". Если нужно сделать подсветку ключевых слов и/или мнемоник, думаю ничего сложного, а с учётом производительности современных компов, работать будет не сильно тормознуто.
...
Вот как-то так. Писал "по ходу пьессы", потому ни_на_каком языке приближенным к Ц, но общий ход мыслей наверно понятен. Реализацию функции предлагаю в качестве домашнего задания. ;)

Да я вобщем-то представляю как писАть парсеры, и смею заверить, что
вполне успешно с этим справлялся в задачах транслирования на язык
ассемблера... :wink:
Просто хотелось сэкономить время и удачно соединить свою наработку
с тем, что, возможно, у кого-то в заделе есть.
Смею заверить, что будь у меня такой готовый продукт, я бы не стал
ему делать здесь рекламу - с ДОС-программами мало кто работает.


07 Jul 2011 05:19
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Написать будет быстрее, чем удачно соединяться с чужим кодом ;)
Например брат моей бывшей жены ещё будучи школьником написал
для RW1 редкатор с подсветкой синтаксиса с нуля всего за несколько дней:

Image

_________________
:dj: https://mastodon.social/@Shaos


07 Jul 2011 06:14
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Написать будет быстрее, ...

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


07 Jul 2011 07:03
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Написать будет быстрее, чем удачно соединяться с чужим кодом ;)
Например брат моей бывшей жены ещё будучи школьником написал
для RW1 редкатор с подсветкой синтаксиса с нуля всего за несколько дней:

Image


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

Code:
// 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();
}

_________________
:dj: https://mastodon.social/@Shaos


07 Jul 2011 20:35
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Спасибо Shaos! Попробую заюзать...

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

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


08 Jul 2011 08:58
Profile
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
Post 
Я поступал проще - проходил по строке, брал фрагмент между разделителями, вычислял CRC и искал её в таблице, если находил - брал цвет. Была ещё пара исключений типа префиксов "0x", "#" и еще чего-то.

_________________
Extreme Entertainment


08 Jul 2011 09:53
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Mac Buster wrote:
Я поступал проще - проходил по строке, брал фрагмент между разделителями, вычислял CRC и искал её в таблице, если находил - брал цвет.

А КЦК как считал - как в РК, или сеьёзный CRC ?


08 Jul 2011 10:39
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Нужно же некое подобие хэша. CRC тут мало подходит, хотя в небольшом количестве вариантов вполне пригодно.


08 Jul 2011 11:47
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
маленький хэш имеет большую вероятность коллизий (в данном случае ошибочная подсветка), а большой хэш долго считается, так что наверное бинарный поиск по словарю отсортированных в алфавитном порядке слов - наиболее оптимальный по скорости и надёжности подход (вышеприведённый пример не оптимален - там просто идёт тупой перебор от начала до конца словаря - и это приемлимо работало на Pentium-60, который медленнее чем 486DX4)

_________________
:dj: https://mastodon.social/@Shaos


08 Jul 2011 17:59
Profile WWW
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
Post 
Lavr wrote:
А КЦК как считал - как в РК, или сеьёзный CRC ?


Я взял чью-то быструю реализацию, CRC16 кажется.

_________________
Extreme Entertainment


09 Jul 2011 00:18
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Mac Buster wrote:
Lavr wrote:
А КЦК как считал - как в РК, или сеьёзный CRC ?


Я взял чью-то быструю реализацию, CRC16 кажется.


Если уже в CRC32 на коллизии можно нарваться (я нарывался), то в CRC16 и подавно - в результате могут быть подсвечены слова, никакого отношения не имеющие к словарю...

_________________
:dj: https://mastodon.social/@Shaos


09 Jul 2011 07:10
Profile WWW
Devil

Joined: 26 May 2003 06:57
Posts: 859
Reply with quote
Post 
Обычно, одному значению хеша соответствует несколько элементов, поэтому после выборки списка элементов по таблице делают точное сравнение элементов.

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


09 Jul 2011 08:53
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
b2m wrote:
Обычно, одному значению хеша соответствует несколько элементов, поэтому после выборки списка элементов по таблице делают точное сравнение элементов.


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

в любом случае перебор так или иначе остаётся...

_________________
:dj: https://mastodon.social/@Shaos


09 Jul 2011 12:29
Profile WWW
Retired

Joined: 03 Aug 2003 22:37
Posts: 1474
Location: Moscow
Reply with quote
Post 
Shaos wrote:
тогда можно выбрать очень быстрый хэш - первая буква слова ;)

в любом случае перебор так или иначе остаётся...


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

_________________
Extreme Entertainment


10 Jul 2011 12:16
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 30 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 18 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.