|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1390 Location: Abakan
|
Напиши парсер "в лоб". Если нужно сделать подсветку ключевых слов и/или мнемоник, думаю ничего сложного, а с учётом производительности современных компов, работать будет не сильно тормознуто.
Конечно, если задумывать интеллектуальный парсер, который будет еще и разбором синтаксиса на правильность заниматься, то это геморройно.
И еще не получится заморачивайся комментариями в стиле /* ... */ - банально не сможешь остледить, если начало и конец за экраном. Хотя комментарии в стиле // можно и попробовать сделать, хотя думаю что ни к чему.
Тоже кстати относится к подсветке слов, если экран не в начале строки.
Для начала нужна будет функция например 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 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да я вобщем-то представляю как писАть парсеры, и смею заверить, что
вполне успешно с этим справлялся в задачах транслирования на язык
ассемблера...
Просто хотелось сэкономить время и удачно соединить свою наработку
с тем, что, возможно, у кого-то в заделе есть.
Смею заверить, что будь у меня такой готовый продукт, я бы не стал
ему делать здесь рекламу - с ДОС-программами мало кто работает.
|
07 Jul 2011 05:19 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
Написать будет быстрее, чем удачно соединяться с чужим кодом
Например брат моей бывшей жены ещё будучи школьником написал
для RW1 редкатор с подсветкой синтаксиса с нуля всего за несколько дней:
|
07 Jul 2011 06:14 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да - ты прав, я уже и сам понял, что написать гораздо быстрее,
чем читать ненужные советы и оффтоп реплики...
|
07 Jul 2011 07:03 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
Вот - нашёл сырцы класса, которым подсветка собственно и осуществлялась:
| | | | 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(); }
| | | | |
|
07 Jul 2011 20:35 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Спасибо Shaos! Попробую заюзать...
По сравнению с Colorer и Colorizer - твой код хотя бы
обозрим взглядом...
Кстати говоря, если для кого представляет интерес - исходники Colorer и Colorizer
я могу выложить - я что-то несколько лет не сподобился их использовать...
|
08 Jul 2011 08:58 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Я поступал проще - проходил по строке, брал фрагмент между разделителями, вычислял CRC и искал её в таблице, если находил - брал цвет. Была ещё пара исключений типа префиксов "0x", "#" и еще чего-то.
_________________ Extreme Entertainment
|
08 Jul 2011 09:53 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А КЦК как считал - как в РК, или сеьёзный CRC ?
|
08 Jul 2011 10:39 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Нужно же некое подобие хэша. CRC тут мало подходит, хотя в небольшом количестве вариантов вполне пригодно.
|
08 Jul 2011 11:47 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
маленький хэш имеет большую вероятность коллизий (в данном случае ошибочная подсветка), а большой хэш долго считается, так что наверное бинарный поиск по словарю отсортированных в алфавитном порядке слов - наиболее оптимальный по скорости и надёжности подход (вышеприведённый пример не оптимален - там просто идёт тупой перебор от начала до конца словаря - и это приемлимо работало на Pentium-60, который медленнее чем 486DX4)
|
08 Jul 2011 17:59 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Я взял чью-то быструю реализацию, CRC16 кажется.
_________________ Extreme Entertainment
|
09 Jul 2011 00:18 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
Если уже в CRC32 на коллизии можно нарваться (я нарывался), то в CRC16 и подавно - в результате могут быть подсвечены слова, никакого отношения не имеющие к словарю...
|
09 Jul 2011 07:10 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 859
|
Обычно, одному значению хеша соответствует несколько элементов, поэтому после выборки списка элементов по таблице делают точное сравнение элементов.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
09 Jul 2011 08:53 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
тогда можно выбрать очень быстрый хэш - первая буква слова
в любом случае перебор так или иначе остаётся...
|
09 Jul 2011 12:29 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Гражданка (не помню какой страны) Харпер предложила при формировании мнемоники команды брать первую и 4-ю букву слова-команды. Вроде бы многие этому предложению и следовали. Так что брать некую выборку из мнемоники имеет смысл.
_________________ Extreme Entertainment
|
10 Jul 2011 12:16 |
|
|
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
|
|