Нужно реализовать подсветку синтаксиса. Интересует алгоритм.
Вот что я придумал:
1) Сканируем текст посимовольно до тех пор пока не следующий симовол не входит в множество [a..z, A..Z, 0..9]
2) Получившееся слово ищем в списке ключевых слов
3) Если находим — обрамляем его тэгами
На первый взгляд — все просто, но чуствую есть подводные камни, которых я не учел. Что скажете ?
Здравствуйте, DemAS, Вы писали:
DAS> Добрый день.
DAS> На первый взгляд — все просто, но чуствую есть подводные камни, которых я не учел. Что скажете ?
маленьки примерчик: /* new object() */ — но сначало это коментарий!!! а слова в середине тогда теряют свое назначение
Здравствуйте, DemAS, Вы писали:
DAS>Здравствуйте, alku, Вы писали:
A>>маленьки примерчик: /* new object() */ — но сначало это коментарий!!! а слова в середине тогда теряют свое назначение
DAS> Что посоветуешь ? Конечные автоматы ?
смотря что хотиш:
— если расчет на то что надо в рантайме менять конфигурацию рассветки, то прийдеться повозиться самому
— если просто под определнный язык надо сделать, то тогда надо смотреть в сторону уже готовых либ...
зайди на форум посвещенный r# — там вроде эта тема подымалась и обсуждаласть...
Здравствуйте, alku, Вы писали:
A>смотря что хотиш: A>- если расчет на то что надо в рантайме менять конфигурацию рассветки, то прийдеться повозиться самому A>- если просто под определнный язык надо сделать, то тогда надо смотреть в сторону уже готовых либ...
Хочу конвертер — на вход txt, на выходе расцвеченный html.
А что есть из готовых либ.... ?
Язык довольно специфичен и либу именно под этот язык найти не удастся, поэтому надо искать нечто очень конфигурабельное.
Например, если есть строка — 'stri\'ng' — то это должно подсветиться одной строкой, так как вторая ' — экранируется слешем.
Здравствуйте, DemAS, Вы писали:
DAS> Хочу конвертер — на вход txt, на выходе расцвеченный html. DAS> А что есть из готовых либ.... ?
DAS> Язык довольно специфичен и либу именно под этот язык найти не удастся, поэтому надо искать нечто очень конфигурабельное. DAS> Например, если есть строка — 'stri\'ng' — то это должно подсветиться одной строкой, так как вторая ' — экранируется слешем.
[]
DAS> Хочу конвертер — на вход txt, на выходе расцвеченный html. DAS> А что есть из готовых либ.... ?
Я когда-то писал и даже запостил в форум "Исходники" набор компонентов для дебилдера, предназначенных как раз для расцветки исходного кода в HTML. Конфигурится там цвет, шрифт и пр. по мелочи. При желании можно написать свой компонент, основываясь на том, что есть.
Здравствуйте, DemAS, Вы писали:
DAS>Здравствуйте, alku, Вы писали:
A>>смотря что хотиш: A>>- если расчет на то что надо в рантайме менять конфигурацию рассветки, то прийдеться повозиться самому A>>- если просто под определнный язык надо сделать, то тогда надо смотреть в сторону уже готовых либ...
DAS> Хочу конвертер — на вход txt, на выходе расцвеченный html. DAS> А что есть из готовых либ.... ?
DAS> Язык довольно специфичен и либу именно под этот язык найти не удастся, поэтому надо искать нечто очень конфигурабельное. DAS> Например, если есть строка — 'stri\'ng' — то это должно подсветиться одной строкой, так как вторая ' — экранируется слешем.
В примерах к Boost'овскому regex'у есть такая штука — лежит в boost/libs/regex/example/snippets/regex_merge_example.cpp. Превращает cpp в подсвеченный html. Очень простая и меняется очень легко.
Здравствуйте, DemAS, Вы писали:
DAS>Здравствуйте, alku, Вы писали:
A>>маленьки примерчик: /* new object() */ — но сначало это коментарий!!! а слова в середине тогда теряют свое назначение
DAS> Что посоветуешь ? Конечные автоматы ?
Твоя задача — это ровно то, что делает лексический анализатор любого языка. А они, как правило, построены на автоматных грамматиках.
Так что — конечный автомат, без сомнения, тебя удовлетворит.
Причём автомат должен выдавать результаты (скажем, строку </span><span class=keyword> ) при смене состояний, а не пребывая в состояниях.
То есть, по сути, это автомат Милли. Он описывается множеством четвёрок (state,input,next,output), где output не пуст, в случае, если автомат проходит через границу лексемы. В грубом виде, значение output — это
"<span class='$next'>' если state==BEGIN
"</span><span class='$next'>" если state!=next
"</span>" если next==END
"" если state==next.
Хотя, конечно, по хорошему нужно различать границы лексем, принадлежащих одному классу. (Мало ли, захочется бордюр рисовать вокруг каждой из них). Пример: строка <<<<< на С++ будет разбита на 3 лексемы << << <