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

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

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

Post by citRiks »

John Doe, Это понятно что изобретать велосипеды это плохая практика.
И все же, стоит ли так углублятся,
если предложенное мною выглядит достаточно просто, не?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2779
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 151 times
Been thanked: 399 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Thu 18 Feb, 2021 08:28 может нужно тупа сделать итерацию такую по всем буквам с начала:…
Именно так и устроена та прога, что я Вам посылал.
User avatar
citRiks
Posts: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 times

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

Post by citRiks »

buniak_a_h, это LuaComplete или то что на паскале?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13181
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 45 times
Been thanked: 333 times

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

Post by John Doe »

citRiks wrote: Thu 18 Feb, 2021 09:49 И все же, стоит ли так углублятся,
Зависит от того насколько строго должен быть осуществлён отбор, плюс сколько времени вы готовы дополнительно потом инвестировать в доводку своего велосипеда, при каждой встрече с нетипичным случаем.

Замечу также, что модуль luacheck, который наверняка у вас тоже установлен, содержит и парсер, и лексер (но как приспосособить их интерфейсы к вашей задаче сходу не скажу конечно).
https://t.me/FarManager — Telegram чат
buniak_a_h
Posts: 2779
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 151 times
Been thanked: 399 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Thu 18 Feb, 2021 10:27 buniak_a_h, это LuaComplete или то что на паскале?
Это то, что на паскале.
User avatar
citRiks
Posts: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 times

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

Post by citRiks »

John Doe wrote: Thu 18 Feb, 2021 11:47Зависит от того насколько строго должен быть осуществлён отбор, плюс сколько времени вы готовы дополнительно потом инвестировать в доводку своего велосипеда, при каждой встрече с нетипичным случаем.
как всегда прав, а я как всегда захотел протестировать свои speed coding abilities, с как всегда удручающим успехом.
За три часа :-( включая перерывы, получилось такое нa C# ,
на условия задачи отвечает целиком и полностью,
учитываются блочные строки и комментарии
  1. static void _lua_code_cmnt_line_dissect(string sz_inp_lua_str, out int int_out_pos_idx_cmnt, out string sz_out_lua_code, out string sz_out_lua_cmnt, out string sz_out_lua_mask)
  2. {
  3.     StringBuilder sb_mask_quoted = new StringBuilder();
  4.     sz_out_lua_code = "";
  5.     sz_out_lua_cmnt = "";
  6.     sz_out_lua_mask = "";
  7.     int_out_pos_idx_cmnt = -1;
  8.     List<char> lst_quotes = new List<char>() { '\'', '"' };
  9.     rgx.Regex rgx_flow_start = new rgx.Regex(@"^\[=*\[");
  10.     const char
  11.         CH_ESCAPE = '\\',
  12.         CH_QUOTE_NONE = 'x',
  13.         CH_QUOTE_MASK = '#',
  14.         CH_CMT_START = '-',
  15.         CH_BLK_START = '[',
  16.         CH_BLK_FINAL = ']';
  17.     const string STR_CMT_MARK_LINE = "--";
  18.     char ch_quote_curr = CH_QUOTE_NONE, ii_ch;
  19.     int cnt_escape = 0;
  20.     string sz_cur_blk_beg = null, sz_cur_blk_end = null;
  21.     for (int ii = 0; ii < sz_inp_lua_str.Length; ii++)
  22.     {
  23.         ii_ch = sz_inp_lua_str[ii];
  24.         // we are inside quotes:
  25.         if (ch_quote_curr != CH_QUOTE_NONE)
  26.         {
  27.             if (ii_ch == CH_ESCAPE)
  28.             { // \', \"
  29.                 cnt_escape += 1;
  30.             }
  31.             else
  32.             {
  33.                 if (cnt_escape == 0)
  34.                 {
  35.                     if (ii_ch == ch_quote_curr)
  36.                         ch_quote_curr = CH_QUOTE_NONE;
  37.                 }
  38.                 else
  39.                 {
  40.                     cnt_escape = 0;
  41.                 }
  42.             }
  43.             ii_ch = CH_QUOTE_MASK;
  44.         }
  45.         else if (sz_cur_blk_end != null)
  46.         { // we are inside some flow block here
  47.             if (
  48.                 // this is ']' character here:
  49.                 ii_ch == CH_BLK_FINAL &&
  50.                 // the current substring matches required block end:
  51.                 sz_inp_lua_str.Substring(ii).StartsWith(sz_cur_blk_end)
  52.                     )
  53.             {
  54.                 { /* just skip end block mark characters.
  55.                     Not too elegant, but let it be this way: */
  56.                     for (int jj = 0; jj < sz_cur_blk_end.Length; jj++)
  57.                         sb_mask_quoted.Append(CH_QUOTE_MASK);
  58.                     ii += sz_cur_blk_end.Length - 1;
  59.                 }
  60.                 // this cancels flow block indication:
  61.                 sz_cur_blk_beg = sz_cur_blk_end = null;
  62.                 continue;
  63.             }
  64.             else
  65.             {
  66.                 ii_ch = CH_QUOTE_MASK;
  67.             }
  68.         }
  69.         else
  70.         { // we are not in quotes and not in flow block
  71.             if (lst_quotes.Contains(ii_ch))
  72.             { // we met single quote character
  73.                 ch_quote_curr = ii_ch;
  74.                 ii_ch = CH_QUOTE_MASK;
  75.             }
  76.             else if (ii_ch == CH_BLK_START)
  77.             { // propbably we should start flow block?
  78.                 rgx.Match rem_block_start = rgx_flow_start.Match(sz_inp_lua_str.Substring(ii));
  79.                 if (rem_block_start.Success)
  80.                 { // this is flow block indeed!
  81.                     sz_cur_blk_beg = rem_block_start.Value;
  82.                     sz_cur_blk_end = sz_cur_blk_beg.Replace(CH_BLK_START, CH_BLK_FINAL);
  83.                     ii_ch = CH_QUOTE_MASK;
  84.                 }
  85.             }
  86.             else if (
  87.                 // this is '-' character here?
  88.                 ii_ch == CH_CMT_START &&
  89.                 // this is "--" string here?
  90.                 sz_inp_lua_str.Substring(ii).StartsWith(STR_CMT_MARK_LINE))
  91.             {
  92.                 if (rgx_flow_start.IsMatch(sz_inp_lua_str.Substring(ii + STR_CMT_MARK_LINE.Length)))
  93.                 { /* this is --[=*[ here, consider it as flow block, and mask starting "--".
  94.                     Similar treatment to "if block end .." handler above */
  95.                     for (int jj = 0; jj < STR_CMT_MARK_LINE.Length; jj++)
  96.                         sb_mask_quoted.Append(CH_QUOTE_MASK);
  97.                     ii += STR_CMT_MARK_LINE.Length - 1;
  98.                     continue;
  99.                 }
  100.                 else
  101.                 { // got it! this is conventional in-line comment after "--":
  102.                     int_out_pos_idx_cmnt = ii;
  103.                     sz_out_lua_code = sz_inp_lua_str.Substring(0, int_out_pos_idx_cmnt);
  104.                     sz_out_lua_cmnt = sz_inp_lua_str.Substring(int_out_pos_idx_cmnt);
  105.                     sb_mask_quoted.Append(sz_out_lua_cmnt);
  106.                     break;
  107.                 }
  108.             }
  109.             else
  110.             {
  111.                 /* this is just lua code statements,
  112.                 no inside any block, not inside any quotes,
  113.                 nothing to do */
  114.             }
  115.         }
  116.         sb_mask_quoted.Append(ii_ch);
  117.     }
  118.     sz_out_lua_mask = sb_mask_quoted.ToString();
  119. } // _lua_code_cmnt_line_dissect
input:
local a1 = [[ -- aaa -- bbb ccc ]] xxx --[[ hello ? ]] yyy --[===[ hello 222 ]===] -- line comment here
output:
int_out_pos_idx_cmnt = 83 sz_out_lua_code = "local a1 = [[ -- aaa -- bbb ccc ]] xxx --[[ hello ? ]] yyy --[===[ hello 222 ]===] " sz_out_lua_cmnt = "-- line comment here" sz_out_lua_mask = "local a1 = ####################### xxx ############### yyy ####################### -- line comment here"
PS
одинарных кавычек в примере нету, так как это "слишком легко", были в первых тестах,
а скопипастил я второй и более сложный тест на flow block, которые по сути много-символьные кавычки.
Не прогоняя еще раз, просто напишу так:

input:
local a1 = ' -- aaa -- bbb ccc '..xxx --[[ hello ? ]]..yyy..[[ hello 222 ]] -- line comment here
output:
int_out_pos_idx_cmnt = 77 sz_out_lua_code = "local a1 = ' -- aaa -- bbb ccc '..xxx --[[ hello ? ]]..yyy..[[ hello 222 ]] " sz_out_lua_cmnt = "-- line comment here" sz_out_lua_mask = "local a1 = #####################..xxx ###############..yyy..############### -- line comment here"
UPDATE 21/03/2021
Немного косметики
Last edited by citRiks on Sat 20 Mar, 2021 23:06, edited 3 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
citRiks
Posts: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 times

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

Post by citRiks »

buniak_a_h wrote: Wed 17 Feb, 2021 17:23 P/S. Вот такие паттерны работают:
Line:match([[^(.*%b"".-)%-%-]]), regex.match(Line, [[^(.*['"].*['"].*)--]])
Если несколько литералов - работают тоже.
Первый работает только для литералов, заключённых в двойные кавычки.
Второй не будет работать, если внутри литерала с одним типом кавычек имеется символ другой (здесь «кавычками» я называю и апостроф ', и кавычки ")
в копилку паттернов, это взято из МобДебуг @П.Кульченко:
-- remove block comments: :gsub("%-%-%[(=*)%[.-%]%1%]", "") -- remove line comments :gsub("%-%-.-\n", " ")
Взято откуда-то:
-- remove line comments: :gsub(s, "%-%-+(.*)$", "%1") :gsub(s, "%-%-+ ?(.*)$", "%1")
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
citRiks
Posts: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 times

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

Post by citRiks »

PS2
Кажется что наиболее разумно было бы решать подобное через LPEG все же,
с прибавочной стоимостью "знать LPEG".
если бы уже в процесс писания я не вспомнил бы про проблему "блочные/потоковые каменты и кавычки", написал бы через LPEG, но увы ..
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6280
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 380 times

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

Post by Shmuel »

В мануале LPeg есть готовый пример для Lua's long strings. Модифицировать его для комментариев должно быть очень просто.
buniak_a_h
Posts: 2779
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 151 times
Been thanked: 399 times
Contact:

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

Post by buniak_a_h »

citRiks wrote: Sat 20 Mar, 2021 18:53 наиболее разумно было бы решать подобное через LPEG все же
1. Я не знаю, что такое LPEG. Предположил, что язык регэкспов.
2. А как быть с литералами? А, например, --[[qqq]] - это блочный комментарий, а ---[[qqq]] - строковый.
3. А ещё блочные комменты и литералы [[…]] могут быть многострочными.
Вам же писали:
John Doe wrote: Thu 18 Feb, 2021 11:47 Зависит от того насколько строго должен быть осуществлён отбор
Last edited by buniak_a_h on Sat 20 Mar, 2021 20:00, edited 1 time in total.
User avatar
citRiks
Posts: 1421
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 431 times
Been thanked: 90 times

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

Post by citRiks »

ваши замечания имеют смысл, рад прояснить
buniak_a_h wrote: Sat 20 Mar, 2021 19:58 1. Я не знаю, что такое LPEG. Предположил, что язык регэкспов.
Parsing Expression Grammar,
лексический анализ, парсит структуру (грамматику) языков, текстовые форматы
buniak_a_h wrote: Sat 20 Mar, 2021 19:58 2. А как быть с литералами? А, например, --[[qqq]] - это блочный комментарий, а ---[[qqq]] - строковый.
3. А ещё блочные комменты и литералы [[…]] могут быть многострочными.
* такую элементарщину даже я в своем коде выше решил :)
* многострочность - это просто другая буква для пробела, так же как и, например, ТАБ
buniak_a_h wrote: Sat 20 Mar, 2021 19:58 Вам же писали:
John Doe писал(а): ↑Чт 18 фев, 2021 13:47
Зависит от того насколько строго должен быть осуществлён отбор
у меня в приведенном коде все строго, прямо как в детском саду :)
Last edited by citRiks on Sat 20 Mar, 2021 22:26, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Post Reply

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