разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Здесь обсуждаются темы, косвенно связанные с Far.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

может сможете мне подсказать, как так вот сделать?
* Есть строчка, строчка это какой-то луа-код
* нужно в строчке найти положения первого "--",
или иными словами, понять где начинается комментарий
* надо учитывать, что именно первого "--", и не относящегося к самому коду.
* т.е., нам не нужен "--" заключенный в кавычки, например:
print(" -- Hello -- Word! --") -- bug! ".. -- WorLd", and not ".. -- WoRD"
тут нужен тот "--", который рядом со словом "bug",
а любой другой - это будет неправильно
Регексп выражение лучше чтобы было на PCRE,
так как код обработки на другом языке, не Луа.
Ну на крайняк, можно и на Луа, а я попробую его переделать для PCRE
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

Как-то я извратился, когда делал поиск видимых переменных в LuaComplete Tabbed. Отсекал от анализа комментарий, при этом --, входящие в строковый литерал, игнорируются. Также у меня есть прога на языке Harbour, удаляющая комментарии. Там, правда, конечным комментом является //, но это - настраиваемые подробности. Надо?
P/S язык Harbour - очень логичный и простой в освоении. Легко переводится на другие (пока не используются программные блоки, записанные в строки. Впрочем, в lua это есть - loadstring).
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

buniak_a_h wrote: Wed 17 Feb, 2021 13:53 Как-то я извратился, когда делал поиск видимых переменных в LuaComplete Tabbed. Отсекал от анализа комментарий, при этом --, входящие в строковый литерал, игнорируются.
ну вроде выглядит как то что надо, довайте
buniak_a_h wrote: Wed 17 Feb, 2021 13:53 Также у меня есть прога на языке Harbour, удаляющая комментарии. Там, правда, конечным комментом является //, но это - настраиваемые подробности. Надо?
довайте тоже посмотрим как минимум :)
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

P/S.
buniak_a_h wrote: Wed 17 Feb, 2021 13:53 при этом --, входящие в строковый литерал, игнорируются
Поправочка. К многострочному комментарию (--[[…]]) и многострочным литералам это, увы не относится
citRiks wrote: Wed 17 Feb, 2021 14:21 выглядит как то что надо, довайте
Дык дал жа! Ссыль указана!
А ещё а перепутал. Прога - на Pascal-е (Delphi-7). Но это ещё лучше.
DelComm.dpr.7z
Удаление комментариев.
(5.06 KiB) Downloaded 130 times
Настройка на язык - это строки, начиная с 241
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

Паскалевская прога, работающая с lua. Удаляет комментарии. На моём файле сработала как из пущи.
В архиве слегка подправленный исходник и результат компиляции
DelComm.7z
(175.22 KiB) Downloaded 138 times
P/S. Забыл написать самое главное.
Единственного regex-выражения, решающего эту задачу, нет. Требуется два прохода. Первый - выставляет признаки, что за символ: просто, строковый литерал или комментарий. Причём, проходить последовательно символ за символом, т.к. тип символа контекстно-зависим: зависит от того, то было раньше. При втором проходе ищется начало (и, возможно, конец) комментария и убивать лишнее.
Last edited by buniak_a_h on Wed 17 Feb, 2021 16:36, edited 2 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

buniak_a_h, интересно это.
мне на первый взгляд показалось что должно решаться просто "взять первый символ [--] не заключенный в кавычки".
но слепить выражение не смог.
допустим, одним выражением нельзя, тогда может быть так?:
1.) Заменить все что внутри кавычек на пробелы (или другую букву)
2.) в том что осталось, найти первый символ "--"

Пока еще не успел посмотреть что вы послали, но уже спасибо!
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

citRiks, в lua есть хороший паттерн: %b[]. Означает текст, заключённый в 2 символа. Увы, нет возможности указать двухсимвольные скобки типа (*---*), /*---*/. А тем более 3-х символьные (как в lua): [=[---]=]. Это - раз.
Есть ещё проблема с многострочными литералами - это два.
Можно заменить то, что в кавычках (паттерны %b'' или b"") на пустые строки (предварительно запомнив место и сам литерал), а в оставшемся поискать --. Затем обрезать и вернуть литералы назад. Но это всё равно не одно рег.выражение. Тем более, что:
(а) в PCRE нет аналога %b, а просто (['"].*['"]) даст сбой, если внутри литерала с апострофами встретится кавычка.
(б) в lua-регэкспах нет альтернативы aaa|bbb т.е. уже надо писать ():match(…) or ():match(…)
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

Для простенького случая подойдёт, наверно, такой паттерн:
Line:match([[^(.*%b"".-)--]])
Будет ли работать при нескольких строковых литералах, я не знаю.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

P/S. Вот такие паттерны работают:
Line:match([[^(.*%b"".-)%-%-]]), regex.match(Line, [[^(.*['"].*['"].*)--]])
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой (здесь «кавычками» я называю и апостроф ', и кавычки ")
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний --
Last edited by buniak_a_h on Wed 17 Feb, 2021 17:37, edited 2 times in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

buniak_a_h wrote: Wed 17 Feb, 2021 17:23 P/S. Вот такие паттерны работают:
Line:match([[^(.*%b"".-)%-%-]]), regex.match(Line, [[^(.*['"].*['"].*)--]])
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой
(здесь «кавычками» я называю и апостроф ', и кавычки ")
buniak_a_h, выглядит интересно, сейчас попробую что получается
я бы подумал, что надо наверное разделить все-таки нейтрализацию кавычек разного типа по отдельности,
чтобы не создавать путаницу из них?
или в итоге все равно работает правильно?
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

buniak_a_h wrote: Wed 17 Feb, 2021 17:35 Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний --
это я не понял, это хорошо или плохо? :)
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by buniak_a_h »

citRiks wrote: Wed 17 Feb, 2021 20:05
buniak_a_h wrote: Wed 17 Feb, 2021 17:35 Я ни фига не понимаю! Запутать мне не удалось. Проверял на литерале:
[[ version -- = "1.1--.1'" .. "2--.2.2"; --http://semver.org/lang/ru/ "aaa"]]
Хотя нет. Берётся последний --
это я не понял, это хорошо или плохо? :)
В приведённом примере обрезается по 2.2"; . А правильно было бы, чтобы осталось только первое слово version с пробелами. Т.е. оставляются все литералы, даже если они закомментированы. Удаляется только последний комментарий. Я не знаю, хорошо это, или плохо. Что будет, если в исходной строке нет строкового литерала, я не проверял.
citRiks wrote: Wed 17 Feb, 2021 20:04 я бы подумал, что надо наверное разделить все-таки нейтрализацию кавычек разного типа по отдельности,
чтобы не создавать путаницу из них?
или в итоге все равно работает правильно?
Разделить - это было бы правильно, только в regex.match тогда вместо ['"].*['"] написать '[^']*' для одиночных кавычек и "[^"]*" для двойных. Ну и проверять, какой из паттернов "срабатывает" первым, если срабатывают оба. Например, [[ qqqqq 'aaaaa"bbbbb"aaaaa' -- …]] - результат зависит от порядка анализа. А значит, надо то, что до кавычки, тоже заключить в скобки (^(.*)'[^']*') для одиночной и соответственно для двойной и сравнивать длины первого соответствия
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

разделить строку кода и строчный комментарий в конце этой строки RegExp-ом, или как-то еще?

Post by citRiks »

buniak_a_h, мдя, получается полный бардак..
может нужно тупа сделать итерацию такую по всем буквам с начала:
* Встречаем кавычку, значит пропускаем все до следующей такой же кавычки выхода, которая будет закрывающей.
* учесть что может быть "escaping", типа как: lua:='\'', или: lua:="\""

Так вроде не должно быть затратно по CPU, так как итерация всего лишь одна
Post Reply

Return to “Операционные системы, командные оболочки и прочее”