За последние 24 часа нас посетили 16244 программиста и 1384 робота. Сейчас ищут 918 программистов ...

Подсветка синтаксиса

Тема в разделе "Регулярные выражения", создана пользователем Kreker, 16 июн 2009.

  1. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну дело в том, что я знаю это и далеко не новичок в работе с регулярными выражениями :)
    Только в данном случае флаг m толи ничего не делал, толи я его не туда вставлял.
     
  2. kostyl

    kostyl Guest

    Kreker
    Ну как там дела у тебя?
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Все-таки это флаг "s" :
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Дела пока фигово. Писал регулярку для кавычек, уже вроде полностью нормально подсвечивала супер-пупер заковыристую строку, потом я внес изменения и... какая-то ерунда началась. Еще поковырялся, пока забил, за нехваткой времени. Вообще, подумываю над тем, чтобы парсить текст посимвольно для кавычек, хередоков и комментариев.

    Касаемо Геши - онлайн-подсветка в десять раз увеличивает время работы скрипта, при учете, что подсвечиваемый код имеет 20 строк. Он крутой, конечно, но грузить около 300 килобайт для подсветки -)


    TheShock
    флаг S - в РНР, для JS это флаг g (global matching)
     
  5. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    я в консольном форуме делал развернутый парсер строки. он должен был правильно делить такие вещи:

    Код (Text):
    1. cd "../../" && clear
    2. echo "if ($a && $b)" && ls /
    3. echo "something \\\\\\" - тут кавычка неэкранированная
    4. echo "something \\\\\\\" - тут - экранированная
    Ну и тому подобное.

    Решил я это так.
    1. Выбираем экранирующий символ. В html это "&". То есть " == ", & == &. Я выбрал символ символ %
    2. Заменяем все проценты на их коды - %[es]
    3. Заменяем парные слешы кодом слеша - %[bs]. Таким образом все экранированные слеши отключаются
    4. Заменяем экранированные двойные кавычки, обычные кавычки, пробелы.

    5. Ищем все строки /(["'])(.*?)\1/ и заменяем их на экранированные сущности, например %[NX], где X - номер строки по счету. Строки заносим в массив с индексом, где индекс равен коду X.
    6. После этого я смело могу делить строку по символам "&&"
    7. После этого парсю каждую из них по отдельности, деля ее по пробелам и анализируя каждое отдельное слово.

    Конечно, в подсветке кода принцип не совсем такой, но, думаю, подтолкнет на размышления.

    Ну и стоит, конечно, почитать, как пишутся интерпретаторы и компиляторы. Думаю, там тоже пару идей можно найти.
     
  6. kostyl

    kostyl Guest

    Я это и имел в виду.
    Потому текст что надо обрабатывать иногда блоками, а находить блоки посимвольно, ну по крайней мере в серверной части, ну в JS почти также, тоесть по разному.
    При этом надо еще сохранять нужную тебе легковесность, что иногда не получается. Да сейчас компы мощные, но не у всех :)
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    TheShock
    string = ' \'\' "\'" \' \' "\'\'" /*/**/ "\\"" /* " " \'b\' */ \'abc\' " \' \\" \\" \' " \'""\' \'"\' \'"\' \'\\\'\' "\'" \'cde\'';