Показать сообщение отдельно
  #5 (permalink)  
Старый 06.09.2010, 16:51
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Алгоритм задумывается не такой, как обычно делают (для клиентской подсветки синтаксиса, серверные варианты я не смотрел, но где-то читал, что они лучше). В обычных алгоритмах, например, сначала ищутся все строки, потом комментарии, в результате вот это:
/* " */ var str = "asdf";

действительно будет неверно распознано. Если изменить порядок поиска, т. е. теперь сначала комментарии, потом строки, все будет как надо, но лишь до тех пор, пока не попадется что-нибудь вроде:
var str = "as/*df";/* " */

Другими словами обычные алгоритмы сначала ищут какие-то конструкции одного типа, затем другого (там конечно похитрей все, но суть примерно такая). В своем варианте я хочу сделать, чтобы искалось как бы все сразу, последовательно. Будет что-то вроде анализа кода слева направо, подобно тому, как это делают интерпретаторы. В результате ошибки с распознаванием подобных конструкций:
Сообщение от Kolyaj
/* " */ var str = "asdf";
уже исключаются.

Далее алгоритм, найдя конструкцию какого-то типа, например строку, переключается в другой режим, применительно к строке это будет режим поиска окончания строки. За счет переключения режимов, ошибки вроде этой:
alert(/^\//);

так же исчезнут: режим поиска окончания регулярки уже не будет реагировать на два слеша как на комментарий.

Тут конечно много всего придется предусмотреть, например, кавычка в строке может быть экранирована, т. е. это уже не конец строки. Причем мало просто смотреть есть перед кавычкой слеш или нет, нужно считать количество этих слешей т. к. если их четное количество, то экранируют они только сами себя. Могут быть многострочные строки:
var x = 'as\
df';

Многие ЯП поддерживают строки которые воспринимаются "как есть": C# :
string s = @"asdf\";

в примере вторая кавычка вовсе не экранирована.

В общем, как-то сложно все это выглядит.

Последний раз редактировалось Riim, 06.09.2010 в 17:43.
Ответить с цитированием