Javascript.RU

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

Как интерпретатор js отличает знак деления от слешей в /inlineRegExp/ ?
Как интерпретатор js отличает знак деления от слешей в /inlineRegExp/ ?
Ответить с цитированием
  #2 (permalink)  
Старый 06.09.2010, 12:02
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Цитата:
There are two goal symbols for the lexical grammar. The InputElementDiv symbol is used in those syntactic
grammar contexts where a division (/) or division-assignment (/=) operator is permitted. The
InputElementRegExp symbol is used in other syntactic grammar contexts.
http://javascript.ru/ecma/part7#a-7
Ответить с цитированием
  #3 (permalink)  
Старый 06.09.2010, 13:04
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Мне нужно на js написать парсер находящий в коде все комментарии, строки и регулярки (inline).
Со строками я уже все придумал, можно считать, что в коде их уже нет. Комментарии регулярки и деление содержат слеш, нужно их разделить. С комментариями все просто: смотрим следующий после слеша символ, если это еще один "/" или "*", то комментарий.
С отделением деления от регулярки у меня выходит примерно такой план: смотрим теперь уже предыдущий перед слешем символ, игнорируя пробельные символы, если это "(", то либо регулярка стала первым аргументом при вызове функции, либо:
Сообщение от ecma
Чтобы обойти это ограничение, литерал регулярного выражения можно заключить в скобки
т. е. просто регулярка в скобках. Еще может быть "," , т. е. регулярка стала вторым аргументом при вызове (аргументом массива и т. п.), использование деления в этом случае не допускается. Еще символы "=" и ":", теперь регулярка присваивается переменной/свойству, опять же деление в такой конструкции недопустимо.

Пока, получается, нужно искать любой из символов "(,=:" , игнорируя пробельные символы. Если найден - регулярка, нет - деление.

Вопрос: что я забыл? Или может вообще неправильный план?
Ответить с цитированием
  #4 (permalink)  
Старый 06.09.2010, 13:33
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Riim
Со строками я уже все придумал, можно считать, что в коде их уже нет.
Т.е. ты просто вырезаешь кавычки? А если они внутри комментария? А если так?
/* " */ var str = "asdf";


Сообщение от Riim
С комментариями все просто: смотрим следующий после слеша символ, если это еще один "/" или "*", то комментарий.
alert(/^\//);


Я вижу только одно решение: полноценный парсинг.
http://github.com/ry/node/wiki/modul...ser-generators
Ответить с цитированием
  #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.
Ответить с цитированием
  #6 (permalink)  
Старый 06.09.2010, 17:16
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Riim
Тут конечно много всего придется предусмотреть
Я и говорю, в результате придёшь к полноценному синтаксическому разбору по грамматике.
Ответить с цитированием
  #7 (permalink)  
Старый 06.09.2010, 17:45
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Да, похоже, что так. Непонятно только насколько тормозить все это будет.

Последний раз редактировалось Riim, 06.09.2010 в 17:48.
Ответить с цитированием
  #8 (permalink)  
Старый 06.09.2010, 17:48
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Чему там тормозить-то? Один проход по строке.
Ответить с цитированием
  #9 (permalink)  
Старый 06.09.2010, 18:25
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Только эта строка может быть большой. И еще ключевые слова заменяются не во всей строке сразу, а в кусочках, которые получились между строками, регулярками и комментариями, т. е. много-много срабатываний одной и той же регулярки (которая, кстати, довольно тяжелая: /(while|for|in|.....mnogoKeyworlds.....)/g).
Ответить с цитированием
  #10 (permalink)  
Старый 06.09.2010, 18:29
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Ну вот погоняй, чё рассуждать-то.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка блока php в js...Как сделать? reup Общие вопросы Javascript 2 30.07.2009 11:02