Удаления всех комментариев из скрипта.lua

Страницы: 1
RSS
Удаления всех комментариев из скрипта.lua
 
Привет всем!
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, может быть есть у кого уже написанная функция. Поиск  в Google не дал результатов.
Попытался написать сам, на первый взгляд вроде бы просто, но оказалось не все так просто, потому как в середине строки может встретится что то типа того ***   или еще чего и это оказалось выше моих сил.
Спасибо!

***
Код
if bla then bla = '--' end -- коммент
if bla then bla = 'D --' end -- коммент


или

--[[ bla bla bla bla bla --[==[ bla bla bla 
bla bla bla bla -- bla bla bla  -- bla bla --]=] bla 
bla bla bla bla --]]

 
Для однострочного удалось написать, но он не понимает многострочных и если они* встретятся на пути, то они* будут поломаны.
Эта функция сработает правильно, если в строках не будет многострочных комментариев.
Теперь осталось написать функцию для удаления во всем коде многострочных комментов, но тут все точно выше моих сил, даже не знаю с какой стороны подойти к этому.

*многострочные

Код
    local function DeleteSingleLine_Comments(str);
        local boxOpens,boxClose,boxActiv = 0,0,nil;
        local one,two,cmt,Str,rem,n = 0,0,0,'',nil,nil;
        for val in string.gmatch(str,".") do;
           if rem then val = '' end;
           if val == '"' and one == 0 and not boxActiv then;
               if two > 0 then two = 0 else two = 1 end;
           end;
           if val == "'" and two == 0 and not boxActiv then;
               if one > 0 then one = 0 else one = 1 end;
           end;
           if val ~= '['then boxOpens = 0 end;
           if val ~= ']'then boxClose = 0 end;
           if val ~= "-" then cmt = 0 end;
           if val == '[' and one == 0 and two == 0 and not boxActiv then;
               boxOpens = boxOpens+1;
               if boxOpens >= 2 then;
                    boxOpens = 0;
                    boxActiv = true;
               end;
           end;
           if val == ']' and one == 0 and two == 0 and boxActiv then;
               boxClose = boxClose+1;
               if boxClose >= 2 then;
                    boxClose = 0;
                    boxActiv = nil;
               end;
           end;
           if one == 0 and two == 0 and not boxActiv and val == '-' then;
              cmt = cmt + 1;
              if cmt >= 2 then;rem = true;end;
           end;
           Str = Str..val;
        end;
        if str:match('\n%s-$')or str:match('\\n%s-$') then;
            n='\n';
        end;
        if str ~= Str then;
            Str = Str:gsub('--$',(n or ''));
        end;
        return Str;
    end;
 
Надо полноценный парсер луа писать, это все колхоз и работать будет только в простых случаях. Грамматика луа есть в документации, дело за "малым".
 
Цитата
Anton написал:
это все колхоз и работать будет только в простых случаях
Если Учесть  что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!

Цитата
Anton написал:
Грамматика луа есть в документации, дело за "малым".

Прошу прощения за тавтологию, но ей богу ведёте себя как бабы (прошу прощения, не в коем случае не хочу обидеть вас) , я прекрасно понимаю, что нужно почитать мануал и порыться в гугле, и я этим и занимаюсь, а пока моих знаний недостаточно, поэтому я и попросил тут помощи. Так что если не можете помочь, то пройдите мимо и не умничайте, ну или просто возьмите и помогите.
 
Цитата
Archie_ написал:
Если Учесть  что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!
А если в файле нет комментариев вообще, то и strpy сработает безошибочно.

Цитата
Archie_ написал:
Так что если не можете помочь, то пройдите мимо и не умничайте, ну или просто возьмите и помогите.
Я вам помог, если что. Вот прям щас можете начинать гуглить "грамматика", "парсер". Потом, когда засунете грамматику луа в парсер, начнете гуглить "леворекурсивная грамматика". Или вы ждали, что вам готовый код дадут в виде вспоможения?
 
Цитата
Anton написал:
А если в файле нет комментариев вообще, то и strpy сработает безошибочно.
Я же написал , что
Цитата
Archie_ написал:
Если Учесть  что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!
Так что не важно есть комментарии или нет, Функция всегда сработает правильно при условии, что нету много-стр. коммента, если я не прав, то дайте мне знать, на чем она сломалась.


Цитата
Anton написал:
Или вы ждали, что вам готовый код дадут в виде вспоможения?
А вы точно читали мое первое сообщение?
Цитата
Archie_ написал:
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, МОЖЕТ БЫТЬ ЕСТЬ У КОГО УЖЕ НАПИСАННАЯ ФУНКЦИЯ. Поиск  в Google не дал результатов.
 
Цитата
Anton написал:
Я вам помог, если что
Спасибо! Что б вам так помогали!!!
 
По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
 
Цитата
Александр М написал:
По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ?  Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.

---------------------
Функция для удаления всех комментариев в файле.lua, может кому пригодится.

Скрытый текст
 
Цитата
Archie_ написал:
Цитата
Александр М написал:
По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ?  Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.

---------------------
 Функция для удаления всех комментариев в файле.lua , может кому пригодится.
 
     Скрытый текст        
Код
     ...
     --===================================    
Все мои роботы из нескольких тысяч строк, но как-то справляюсь. :) Плагины, что я проверял, некорректно отрабатывали многострочные комментарии.
 
Да, к сожалению не коректно работают.((
 
Цитата
Александр М написал:
но как-то справляюсь. :)
Я не спорю, все как то справляются)), но согласись что потратить десять минут вместо сорока к примеру, это лучше, как не крути.

Цитата
Александр М написал:
некорректно отрабатывали многострочные комментарии.
Да - при прочитывании кавычек я не учел что где то в однострочном комментарии может находится "одна" кавычка и она ломала весь счет. Исправлено - теперь должно все работать правильно.


Все предыдущие функции выше работают не коректно!

Функция для удаления всех комментариев в файле.lua,  
Скрытый текст
 
https://prnt.sc/shecfs

https://prnt.sc/sheayt
 
Цитата
Archie_ написал:
Привет всем!
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, может быть есть у кого уже написанная функция. Поиск  в Google не дал результатов.
Попытался написать сам, на первый взгляд вроде бы просто, но оказалось не все так просто, потому как в середине строки может встретится что то типа того ***   или еще чего и это оказалось выше моих сил.
Спасибо!

***
Код
   if  bla  then  bla  =   '--'   end   -  -  коммент
 if  bla  then  bla  =   'D --'   end   -  -  коммент


или

 --[[ bla bla bla bla bla --[==[ bla bla bla  
bla bla bla bla  -- bla bla bla  -- bla bla --]=] bla  
bla bla bla bla  --]] 

  
выкладываю скрипт (nk_com.lua):
Код
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua: nk_com.lua C:\NK\nk_bot
--результат в  C:\NK\nk_bot_.lua:
--------------------
if arg[1] then
out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
   local len=string.len(s1);    local s="";
   for m=1,len do
      local x=string.byte(s1,m)
      if x==59 then x=32 end
      if x==32 then
         if s~="" and m~=len then
            if f==nil then s=s..string.char(x) f=1 end
         end
      else if x>=32 then s=s..string.char(x); f=nil; end  end
   end
   if  e then s=nil;end
   if s2=="--]]" then e=nil; else   if s2=="--[[" then e=1; s=nil; end end    --многострочный комментарий
   if s then
      local m=string.find(s,"%-%-")
      if m then
      if m==1 then s=nil else  s=string.sub(s,1,m-1)
      end  end
      if s and s~="" then out:write(s.."\n")    end
     end
end
out:close();
end
 
Цитата
nikolz написал:
выкладываю скрипт (nk_com.lua):
Код
   -- удаляем комментарии и лишние пробелы 
 --пример вызова для файла C:\NK\nk_bot.lua: nk_com.lua C:\NK\nk_bot 
 --результат в  C:\NK\nk_bot_.lua: 
 -------------------- 
 if  arg[ 1 ]  then 
out =  io.open (arg[ 1 ] .. "_.lua","w")
 ---------------- 
 for  s1  in   io.lines (arg[ 1 ] .. ".lua")  do 
    local  len =  string.len (s1);     local  s =  "" ;
    for  m =  1 ,len  do 
       local  x =  string.byte (s1,m)
       if  x =  =  59   then  x =  32   end 
       if  x =  =  32   then 
          if  s~ =  ""   and  m~ = len  then 
             if  f =  =  nil   then  s = s ..  string.char (x) f =  1   end 
          end 
       else   if  x >  =  32   then  s = s ..  string.char (x); f =  nil ;  end    end 
    end 
    if   e  then  s =  nil ; end 
    if  s2 =  =  "--]]"   then  e =  nil ;  else     if  s2 =  =  "--[["   then  e =  1 ; s =  nil ;  end   end      -  - многострочный комментарий
    if  s  then 
       local  m =  string.find (s,"% - % - ")
       if  m  then 
       if  m =  =  1   then  s =  nil   else   s =  string.sub (s, 1 ,m -  1 )
       end    end 
       if  s  and  s~ =  ""   then  out:write(s .. "\n")     end 
      end 
 end 
out:close();
 end 
  
Нет - Вообще не работает !  Мои первые нерабочие скрипты, которые выше 12-го сообщения работают лучше. (В 12-м сообщении код вроде коректно работает, пока ошибок не обнаружено)
В моем первом сообщении есть примеры комментариев, так ваш код не один комментарий не обработал коректно.

Вот примеры ошибок вашего кода:
Скрытый текст
 
могу выложить скрипт до и после
объем скрипта 1000 операторов
--------------------------
напишите конкретно что у вас не работает
или выложите свой файл я вам его обработаю и опубликую.
если  есть у вас потребность в таком скрипте.
---------------------
если не умеете запускать то могу выложить скомпилированный или exe файл например для Luajit.
 
вот пример удаления
 
одно замечание
я выделяю многострочные  коммент и так именно обрабатывается коммент в данной программе:
--[[  ......
.......
......
--]]
т е символы выделения всегда в начале строки
у Вас в первом примере завершающий символ в конце строки
 
Цитата
nikolz написал:
если не умеете запускать то могу выложить скомпилированный или exe файл например для Luajit.
Я умею запускать!
Я запустил и увидел что ваш код не работает, а вот вы походу читать не умеете, я вам все ошибки подробно расписал, т.е не все, а первые встретившейся, а всяких загадочных фраз в коде/комментах может быть гораздо больше !
Цитата
nikolz написал:
если  есть у вас потребность в таком скрипте.
Была - я функцию написал (в сообщении 12) и она пока на пять отрабатывает. (ошибок пока не выявлено, тестил со всякими экстремальными фразами и выражениями)
Цитата
nikolz написал:
могу выложить скрипт до и послеобъем скрипта 1000 операторов
--------------------------
напишите конкретно что у вас не работает
или выложите свой файл я вам его обработаю и опубликую.
Для чего вылаживать мне код до и после, я и так все вижу. И я написал и подробно расписал что именно не работает у вас в коде, прочитайте внимательно мое предыдущее сообщения и поймете.
----------
Ваш код работает до тех пор, пока в коде не встретится фраза "--" т.е вот фраза кода
Код
if arg == true then arg2 = "--" end
Вот вам код из одной строки, обработайте его своей функцией что бы не сломать код.
Или пока не встретится в многострочном комментарии конец вложенного комментария,   т.е вот фраза кода (комментарий)
Код
--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]] --]==]
Вот обработайте мне вот этот комментарий своей функцией.
Цитата
nikolz написал:
у Вас в первом примере завершающий символ в конце строки
Вот вы сами уже начинаете осознавать не работа способность вашей функции. потому как следить где закрылся коммент , это точно бред.
Вот вам этот же комментарий, но завершающий символ не в конце строки
Код
--[==[ чтобы использовать многострочный коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент --[=[ вложенный коммент --]=] ]] 
--]==]
Вот обработайте мне вот этот комментарий своей функцией, он по вашему совету закрылся в начале строки!
Так что ваш код работает на повезет - не повезет, так что для меня это полностью не работа способный код. Лучше тогда вручную удалить все, чем испытывать судьбу.
Цитата
nikolz написал:
или выложите свой файл я вам его обработаю и опубликую.
Хорошо)) Вот вам файл. Обработайте его своей функцией.))
Код
local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Я ожидаю получить вот такой результат
Код
local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; 



local bla = 15
А получаю вот это((
Код
local bla = 10 
if bla == 10 then bla = '
if bla == '
открыть многострочный коммент и фразу ]] что бы закрыть
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е.
local bla = 15
Комментарий не удален, код унечтожен!!!
----------------------

Так что если код будет очень большой и в коде будут фразы с двумя тире и этих фраз если будет много в коде и не будет копии этого кода, ТО вас за эту функцию (прошу прощения) мало будет прибить. Так как ваша функция уничтожит часть кода.

Скрытый текст
 
nikolz, А теперь обработайте все эти примеры вот этой функцией
Код
    local function DeleteAll_Comments(text);
        ----
        text = text..'\n';
        local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
        local boxOpens,boxClose,RemStr = 0,0,nil;
        local SingleLine,boxActiv = nil,nil;
        local LineCom,LineComM,LineComRemove = 0,nil,nil;
        ----
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
        end;
        text = table.concat(t3);
        ----
        for val in text:gmatch(".") do;
            t[#t+1] = val;
        end;
        ----
        for i = 1,#t do;
            --------------------
            if Rem then;
                local Cls = RemStr:match('.',x);
                if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
                if Cls == t[i] then x = x + 1 end;
                if Cls ~= t[i] then x = 1 end;
                t[i] = "";
            end;
            --------------------
            --------------------
            if LineComRemove then;
                if t[i] ~= '\n' then;
                    t[i] = "";
                else;
                    LineComRemove = nil;
                end;
            end;
            --------------------
            if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
            if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
                if LineCom >= 3 then;--4 simb>=
                    if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                        if t[i] == "[" then;
                            LineCom = 0;
                            LineComM = nil;
                        end;
                    else;
                        t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                        LineComRemove = true;
                        LineCom,LineComM = 0,nil;
                        boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
                    end;
                end;
                if LineCom == 2 then;
                    LineCom = LineCom+1;
                    if t[i] == "[" then LineComM = 1 end;
                end;
                if t[i] == "-" and LineCom < 2 and not LineComRemove then;
                    LineCom = LineCom+1;
                end;
            end; 
            if not LineComRemove then;
            --------------------------------------------------
                --------------------------------------------------
                if t[i] == "'" and two == 0 and not boxActiv then;
                    if one > 0 then one = 0 else one = 1 end;
                end;
                ---
                if t[i] == '"' and one == 0 and not boxActiv then;
                    if two > 0 then two = 0 else two = 1 end;
                end;
                ---
                if t[i] ~= '['then boxOpens = 0 end;
                if t[i] ~= ']'then boxClose = 0 end;
                if t[i] ~= "-" then cmt = 0 end;
                ---
                if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
                    boxOpens = boxOpens+1;
                    if boxOpens >= 2 then;
                        boxOpens = 0;
                        boxActiv = true;
                    end;
                end;
                --- 
                if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
                    boxClose = boxClose+1;
                    if boxClose >= 2 then;
                         boxClose = 0;
                         boxActiv = nil;
                    end;
                end;
                ---
                if SingleLine then t2[1],t2[2] = '-','-'end;
                
                if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
                   cmt = cmt + 1;
                   if cmt >= 2 then; SingleLine = true; cmt=0 end;
                end;
                ---
                if SingleLine and #t2>=2 then;
                    if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                        t2[#t2+1] = t[i];
                    elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
                       t2 = {};
                       SingleLine = nil;
                    end;
                    ---
                    if t[i] == '[' and #t2==2 then;
                        t2[3] = t[i];
                    elseif #t2 == 2 and t[i] ~= '[' then;
                        t2 = {};
                        SingleLine = nil;
                    end;
                    ---
                    if #t2 > 3 and t[i] == '[' then;
                        Rem = true;
                        for ii = 1,#t2 do;
                            t[i-(ii-1)] = '';
                        end;
                        RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                        t2 = {};
                        SingleLine = nil;
                        if not RemStr or RemStr=='' then Rem = nil end;
                    end;
                end;
            -------
            end;--LineComRemove
        end;--End for #t
        text = table.concat(t);
        ----
        t3 = {};
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('%s%s\n','\n');
        end;
        ----
        return table.concat(t3);
    end;
    --===================================
    
    
    
    --filename = [[C:\\...]]
    
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
 
Ваш парсер относится к классу LL(k), при этом грамматика луа леворекурсивная, то есть в принципе всегда можно подобрать такой скрипт, на котором ваш парсер сфейлит. При этом, поскольку он полностью весь луа не парсит, он сам этого не заметит и выдаст мусор (а должен сказать "не понимаю вот эту вот конструкцию"). Вы верно заметили выше, что лучше день потерять, потом за пять минут долететь, только теряете дни не в ту сторону. Писать LL(k) для луа бессмысленно, как его ни усложняй. Парсер должен быть полным и в данном случае построен по принципу рекурсивного спуска, если вы конечно не хотите загнаться и написать GLR, потому что LALR на грамматике из документации тоже не строится, конфликты возникают. Отсюда этапы пути: а) привести грамматику к форме Грейбах; б) доказать, что получилась грамматика, эквивалентная исходной; в) только потом браться за код (по форме Грейбах уже очень просто написать рекурсивный спуск). Или воспользоваться каким-то генератором, хоть яком, хоть бизоном, хоть этим на яве, забыл как его, хотя с ними геморроя будет больше пожалуй, чем при чисто ручном подходе.
 
Цитата
Anton написал:
Ваш парсер относится к классу LL(k), при этом грамматика луа леворекурсивная, то есть в принципе всегда можно подобрать такой скрипт, на котором ваш парсер сфейлит. При этом, поскольку он полностью весь луа не парсит, он сам этого не заметит и выдаст мусор (а должен сказать "не понимаю вот эту вот конструкцию"). Вы верно заметили выше, что лучше день потерять, потом за пять минут долететь, только теряете дни не в ту сторону. Писать LL(k) для луа бессмысленно, как его ни усложняй. Парсер должен быть полным и в данном случае построен по принципу рекурсивного спуска, если вы конечно не хотите загнаться и написать GLR, потому что LALR на грамматике из документации тоже не строится, конфликты возникают. Отсюда этапы пути: а) привести грамматику к форме Грейбах; б) доказать, что получилась грамматика, эквивалентная исходной; в) только потом браться за код (по форме Грейбах уже очень просто написать рекурсивный спуск). Или воспользоваться каким-то генератором, хоть яком, хоть бизоном, хоть этим на яве, забыл как его, хотя с ними геморроя будет больше пожалуй, чем при чисто ручном подходе.
Я не программист и все эти ваши слова мне толком ничего не дали, а программистом прочитавши про эти слова сразу я не стану, (хотя знаний и поприбавится, если найду время почитать).))
В предыдущем сообщении я пытался сказать, что в отличии от кода nikolz, мой не ломается на элементарных комментариях.
Да - мой код может быть и не красивый с точки зрения программиста, и да - может быть вы и правы, и где то мой код может быть и сфейлит и я этого не отрицаю. Но - но он перебирает весь файл по символьно и вычисляет только комменты вне строк(это важно) и ищет обязательный выход из многострочного коммента по символу входа в него. И как я его не пытался сломать, у меня не получилось и что то мне подсказывает что и не получится, но может я и ошибаюсь и если вам удастся его поломать, то дайти мне знать.
 
Цитата
Archie_ написал:
если вам удастся его поломать, то дайти мне знать
Код
--[[ parse me ]]--
function test()
   print("\"--[[")
   print("\"]]--")
end

test()
 
Цитата
Anton написал:
Цитата
Archie_ написал:
если вам удастся его поломать, то дайти мне знать
 
Код
   --[[ parse me ]]-- 
 function   test ()
    print ( " \" --[[" )
    print ( " \" ]]--" )
 end 

test()
  
Код
    local function DeleteAll_Comments(text);
      ----
      local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
      local boxOpens,boxClose,RemStr = 0,0,nil;
      local SingleLine,boxActiv,Inside = nil,nil,nil;
      local LineCom,LineComM,LineComRemove = 0,nil,nil;
      ----
      for val in (text..'\n'):gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
      end;
      text = table.concat(t3);
      ----
      for val in text:gmatch(".") do;
        t[#t+1] = val;
      end;
      ----
      for i = 1,#t do;
        --------------------
        if Rem then;
          local Cls = RemStr:match('.',x);
          if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
          if Cls == t[i] then x = x + 1 end;
          if Cls ~= t[i] then x = 1 end;
          t[i] = "";
        end;
        --------------------
        --------------------
        if LineComRemove then;
          if t[i] ~= '\n' then;
            t[i] = "";
          else;
            LineComRemove = nil;
          end;
        end;
        --------------------
        if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
        if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
          if LineCom >= 3 then;--4 simb>=
            if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                if t[i] == "[" then;
                  LineCom = 0;
                  LineComM = nil;
                end;
            else;
                t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                LineComRemove = true;
                LineCom,LineComM = 0,nil;
                boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
            end;
          end;
          if LineCom == 2 then;
            LineCom = LineCom+1;
            if t[i] == "[" then LineComM = 1 end;
          end;
          if t[i] == "-" and LineCom < 2 and not LineComRemove then;
            LineCom = LineCom+1;
          end;
        end; 
        if not LineComRemove then;
        --------------------------------------------------
          --------------------------------------------------
          if Inside and (t[i] == "'" or t[i] == '"')then t[i] = "" end;
          if Inside and (t[i] ~= "'" or t[i] ~= '"')then Inside = nil end;
          if (one >= 1 or two >= 1)and t[i] == "\\" then Inside = true end;
          
          if t[i] == "'" and two == 0 and not boxActiv then;
            if one > 0 then one = 0 else one = 1 end;
          end;
          ---
          if t[i] == '"' and one == 0 and not boxActiv then;
            if two > 0 then two = 0 else two = 1 end;
          end;
          ---
          if t[i] ~= '['then boxOpens = 0 end;
          if t[i] ~= ']'then boxClose = 0 end;
          if t[i] ~= "-" then cmt = 0 end;
          ---
          if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
            boxOpens = boxOpens+1;
            if boxOpens >= 2 then;
                boxOpens = 0;
                boxActiv = true;
            end;
          end;
          --- 
          if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
            boxClose = boxClose+1;
            if boxClose >= 2 then;
               boxClose = 0;
               boxActiv = nil;
            end;
          end;
          ---
          if SingleLine then t2[1],t2[2] = '-','-'end;
          
          if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
             cmt = cmt + 1;
             if cmt >= 2 then; SingleLine = true; cmt=0 end;
          end;
          ---
          if SingleLine and #t2>=2 then;
            if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                t2[#t2+1] = t[i];
            elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
               t2 = {};
               SingleLine = nil;
            end;
            ---
            if t[i] == '[' and #t2==2 then;
                t2[3] = t[i];
            elseif #t2 == 2 and t[i] ~= '[' then;
                t2 = {};
                SingleLine = nil;
            end;
            ---
            if #t2 > 3 and t[i] == '[' then;
                Rem = true;
                for ii = 1,#t2 do;
                  t[i-(ii-1)] = '';
                end;
                RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                t2 = {};
                SingleLine = nil;
                if not RemStr or RemStr=='' then Rem = nil end;
            end;
          end;
        -------
        end;--LineComRemove
      end;--End for #t
      text = table.concat(t);
      ----
      t3 = {};
      for val in text:gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('%s%s\n','\n');
      end;
      ----
      return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
    
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
 
Ошибочка вышла в предыдущем сообщении))
Код
    local function DeleteAll_Comments(text);
      ----
      local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
      local boxOpens,boxClose,RemStr,xt = 0,0,nil,nil;
      local SingleLine,boxActiv,Inside = nil,nil,nil;
      local LineCom,LineComM,LineComRemove = 0,nil,nil;
      ----
      for val in (text..'\n'):gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('\n',(' '):rep(2)..'\n');
      end;
      text = table.concat(t3);
      ----
      for val in text:gmatch(".") do;
        t[#t+1] = val;
      end;
      ----
      for i = 1,#t do;
        --------------------
        if Rem then;
          local Cls = RemStr:match('.',x);
          if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
          if Cls == t[i] then x = x + 1 end;
          if Cls ~= t[i] then x = 1 end;
          t[i] = "";
        end;
        --------------------
        --------------------
        if LineComRemove then;
          if t[i] ~= '\n' then;
            t[i] = "";
          else;
            LineComRemove = nil;
          end;
        end;
        --------------------
        if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
        if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
          if LineCom >= 3 then;--4 simb>=
            if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                if t[i] == "[" then;
                  LineCom = 0;
                  LineComM = nil;
                end;
            else;
                t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                LineComRemove = true;
                LineCom,LineComM = 0,nil;
                boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
            end;
          end;
          if LineCom == 2 then;
            LineCom = LineCom+1;
            if t[i] == "[" then LineComM = 1 end;
          end;
          if t[i] == "-" and LineCom < 2 and not LineComRemove then;
            LineCom = LineCom+1;
          end;
        end; 
        if not LineComRemove then;
        --------------------------------------------------
          --------------------------------------------------
          if Inside and (t[i] == "'" or t[i] == '"')then xt=t[i]t[i]=""end;
          if Inside and (t[i] ~= "'" or t[i] ~= '"')then Inside = nil end;
          if (one >= 1 or two >= 1)and t[i] == "\\" then Inside = true end;
          
          if t[i] == "'" and two == 0 and not boxActiv then;
            if one > 0 then one = 0 else one = 1 end;
          end;
          ---
          if t[i] == '"' and one == 0 and not boxActiv then;
            if two > 0 then two = 0 else two = 1 end;
          end;
          ---
          if t[i] ~= '['then boxOpens = 0 end;
          if t[i] ~= ']'then boxClose = 0 end;
          if t[i] ~= "-" then cmt = 0 end;
          ---
          if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
            boxOpens = boxOpens+1;
            if boxOpens >= 2 then;
                boxOpens = 0;
                boxActiv = true;
            end;
          end;
          --- 
          if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
            boxClose = boxClose+1;
            if boxClose >= 2 then;
               boxClose = 0;
               boxActiv = nil;
            end;
          end;
          ---
          if SingleLine then t2[1],t2[2] = '-','-'end;
          
          if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
             cmt = cmt + 1;
             if cmt >= 2 then; SingleLine = true; cmt=0 end;
          end;
          ---
          if SingleLine and #t2>=2 then;
            if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                t2[#t2+1] = t[i];
            elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
               t2 = {};
               SingleLine = nil;
            end;
            ---
            if t[i] == '[' and #t2==2 then;
                t2[3] = t[i];
            elseif #t2 == 2 and t[i] ~= '[' then;
                t2 = {};
                SingleLine = nil;
            end;
            ---
            if #t2 > 3 and t[i] == '[' then;
                Rem = true;
                for ii = 1,#t2 do;
                  t[i-(ii-1)] = '';
                end;
                RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                t2 = {};
                SingleLine = nil;
                if not RemStr or RemStr=='' then Rem = nil end;
            end;
          end;
        -------
        end;--LineComRemove
        if xt then t[i]=xt xt=nil end;
      end;--End for #t
      text = table.concat(t);
      ----
      t3 = {};
      for val in text:gmatch(".-\n")do;
        t3[#t3+1]=val:gsub('%s%s\n','\n');
      end;
      ----
      return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
     
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --=================================== 
 
Я о такой манипуляции
Код
"bla\"bla"
даже и не знал, поэтому и не учел ))
Спасибо за подсказку, еще один баг устранили))  
 
Цитата
Archie_ написал:
еще один баг устранили))
Это экстенсивный путь программирования. Обратите внимание, у вас в коде нет вообще пути "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием. Ну, не запустит ракеты на воронеж, и то спасибо. Хотя кто знает, точно ли не запустит. В общем, где-то когда-то как-то оно все будет работать, если этого достаточно, то и ладно.
 
Цитата
Anton написал:
Обратите внимание, у вас в коде нет вообще пути  "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием.
Про путь это уже обертка и к функции пока не имеет никакого отношения! Про защиту от "не .lua" файла я еще не заморачивался и эта защита пишется в пару строк и за пару минут !
В коде и io.open пока за пределами функции, что бы не мешалась мне и что бы вам при тесте не прописывать их, в конечном варианте io.open будет внутри функции.
Суть функции пока состоит в том, чтобы удалить комментарии максимально безболезненно в любой ситуации в lua файле, а не в каком то с++, про защиту - это позже. А как теперь - поломаете ?
 
Цитата
Archie_ написал:
и эта защита пишется в пару строк и за пару минут
Оптимистичный вы человек.

Цитата
Archie_ написал:
А как теперь - поломаете ?
Я и первый раз цели поломать не ставил, а хотел показать, что вот упустили какую-то особенность и вуаля. Уверен, что есть особенности еще, которые ни вы, ни я не знаем. Речь об этом, а не о конкретном косячке. Впрочем, уже писал, если все устраивает и вы не систему ПРО делаете, то и ладно и хорошо.
 
Anton, Вы меня поражаете своей компетентностью в различных областях в хорошем смысле этого слова! Спасибо за разнообразную помощь и доброжелательное отношение!
 
Цитата
Anton написал:
Оптимистичный вы человек.
А что, проверить расширения у файла, это действительно условие в одну строчку кода.
И даже если не делать всяких этих проверок, и зная что эта функция для очистки комментариев файла.lua и пихать в неё файл с++, как вы написали выше, и при уничтожении этого с++, я считаю, что это не в коем случае не ошибка функции, а тупость человека.

Цитата
Anton написал:
Уверен, что есть особенности еще, которые ни вы, ни я не знаем. Речь об этом, а не о конкретном косячке. Впрочем, уже писал, если все устраивает и вы не систему ПРО делаете, то и ладно и хорошо.
Я и не отрицаю что где то могут быть косячки (хотя на ошибки вы мне так и не указали). Повторюсь, что я не программист и я не в состоянии пропарсить весь lua т.к. моих знаний не достаточно в этой области, а функцию охота максимально безошибочную, поэтому я и обратился за помощью на форум(ы), но на всех форумах либо не было ответа, либо предлагались варианты по типу функции nikolz, которые ломались на элементарных вещах. Не дождавшись помощи, я начал пытаться написать ее сам, но опять же вместо помощи(хотя бы в указании ошибок, а не написании кода) я услышал только критику в стили, что за ересь ты делаешь, у тебя вообще все неправильно, читай то, да то. Я даже если это все прочитаю, то я все равно идеально не напишу, повторюсь - потому что я не программист. И если вы хотели/хотите показать какой вы умный в этой области, то взяли бы и помогли физически, а не умничали! А умничать извините, я тоже умею. Могу начитаться в любой области и умничать сидеть, только толку от этого не будет не какого. Ум свой нужно показывать практический, а не технический!!! От вашего технического ума толку не какого нет(в любой области)!
----------
Посидите на Англоязычных форумах, вы там никогда такой ереси не услышите, типа " Иди читай мануал " или что то в этом духе (ну может быть в редких случаях, и то это скорое всего будет Русский человек), там либо помогут (не обязательно физически, а также в прочтении чего нибудь и в этом случае обязательно предоставят ссылочки на не заумные статьи, что бы человек понял о чем речь), либо пройдут мимо, а на Русско Язычных форумах это сплошь - да рядом. Я не знаю, но это Русский народ свою тупость так показывает что ли, или что, я не понимаю.
---------
А форум для того и существует, что бы обмениваться и делится информацией, просить помощи и помогать друг другу, а не умничать!!!!!!! А если охота поумничать , то это нужно не на форум, а на лавочку к подъезду (Но Русский наш народ по ходу перепутал эти места).
---------
Прошу прощения, если чем то задел, Обидеть не в коем случае не хотел.
 
Исправил кое какие ошибки
Код
    --===========================================================
    local function DeleteAllCommentsLuaFile(text);
        ----
        local t,t2,t3,one,two,cmt,x,Rem = {},{},{},0,0,0,1,nil;
        local boxOpens,boxClose,RemStr,xt = 0,0,nil,nil;
        local SingleLine,boxActiv,Inside = nil,nil,0;
        local LineCom,LineComM,LineComRemove = 0,nil,nil;
        ----
        for val in (text..'\n'):gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('\n$',(' '):rep(2)..'\n');
        end;
        text = table.concat(t3);
        ----
        for val in text:gmatch(".") do;
            t[#t+1] = val;
        end;
        ----
        for i = 1,#t do;
            --------------------
            if Rem then;
                local Cls = RemStr:match('.',x);
                if Cls == t[i] and x == #RemStr then RemStr = nil Rem = nil Cls=nil end;
                if Cls == t[i] then x = x + 1 end;
                if Cls ~= t[i] then x = 1 end;
                t[i] = "";
            end;
            --------------------
            if LineComRemove then;
                if t[i] ~= '\n' then;
                    t[i] = "";
                else;
                    LineComRemove = nil;
                end;
            end;
            --------------------
            if LineCom == 1 and t[i] ~= "-" then LineCom = 0 end;
            if one==0 and two==0 and not boxActiv and not Rem and not LineComRemove then;
                if LineCom >= 3 then;--4 simb>=
                    if t[i] == "[" or t[i] == "=" and LineComM == 1 then;
                        if t[i] == "[" then;
                            LineCom = 0;
                            LineComM = nil;
                        end;
                    else;
                        t[i-0],t[i-1],t[i-2],t[i-3] = '','','','';
                        LineComRemove = true;
                        LineCom,LineComM = 0,nil;
                        boxOpens,boxClose,SingleLine,cmt,t2 = 0,0,nil,0,{};
                    end;
                end;
                if LineCom == 2 then;
                    LineCom = LineCom+1;
                    if t[i] == "[" then LineComM = 1 end;
                end;
                if t[i] == "-" and LineCom < 2 and not LineComRemove then;
                    LineCom = LineCom+1;
                end;
            end; 
            if not LineComRemove then;
                --------------------------------------------------
                if(t[i]=="'"or t[i]=='"')and Inside>0 and(Inside%2)==1 then xt=t[i]t[i]=''end;
                if(t[i]~="'"or t[i]~='"')and t[i]~='\\'and Inside>0 then Inside = 0 end;
                if(one >= 1 or two >= 1) and t[i]=='\\' then Inside = Inside+1 end;
                ---
                if t[i] == "'" and two == 0 and not boxActiv then;
                    if one > 0 then one = 0 else one = 1 end;
                end;
                ---
                if t[i] == '"' and one == 0 and not boxActiv then;
                    if two > 0 then two = 0 else two = 1 end;
                end;
                ---
                if t[i] ~= '['then boxOpens = 0 end;
                if t[i] ~= ']'then boxClose = 0 end;
                if t[i] ~= "-" then cmt = 0 end;
                ---
                if t[i] == '[' and one == 0 and two == 0 and not boxActiv and #t2 < 2 then;
                    boxOpens = boxOpens+1;
                    if boxOpens >= 2 then;
                        boxOpens = 0;
                        boxActiv = true;
                    end;
                end;
                --- 
                if t[i] == ']' and one == 0 and two == 0 and boxActiv then;
                    boxClose = boxClose+1;
                    if boxClose >= 2 then;
                         boxClose = 0;
                         boxActiv = nil;
                    end;
                end;
                ---
                if SingleLine then t2[1],t2[2] = '-','-'end;
                
                if one == 0 and two == 0 and not boxActiv and t[i] == '-' then;
                   cmt = cmt + 1;
                   if cmt >= 2 then; SingleLine = true; cmt=0 end;
                end;
                ---
                if SingleLine and #t2>=2 then;
                    if (t[i] == '[' or t[i] == '=') and #t2 >= 3 then;
                        t2[#t2+1] = t[i];
                    elseif t[i] ~= '[' and t[i] ~= '=' and #t2 >= 3 then;
                       t2 = {};
                       SingleLine = nil;
                    end;
                    ---
                    if t[i] == '[' and #t2==2 then;
                        t2[3] = t[i];
                    elseif #t2 == 2 and t[i] ~= '[' then;
                        t2 = {};
                        SingleLine = nil;
                    end;
                    ---
                    if #t2 > 3 and t[i] == '[' then;
                        Rem = true;
                        for ii = 1,#t2 do;
                            t[i-(ii-1)] = '';
                        end;
                        RemStr = table.concat(t2):gsub('%s',''):gsub('%-',''):gsub('%[',']');
                        t2 = {};
                        SingleLine = nil;
                        if not RemStr or RemStr=='' then Rem = nil end;
                    end;
                end;
            -------
            end;--LineComRemove
            if xt then t[i]=xt xt=nil end;
        end;--End for #t
        text = table.concat(t);
        ----
        t3 = {};
        for val in text:gmatch(".-\n")do;
            t3[#t3+1]=val:gsub('%s%s\n$','\n');
        end;
        ----
        return table.concat(t3);
    end;
    --===================================
    
    --filename = [[C:\\...]]
     
    local file = io.open(filename..'.lua','r');
    if not file then return end;
    local text = file:read('a');
    file:close();
    -----
    text = DeleteAll_Comments(text);
    -----
    file = io.open(filename..'_.lua','w');
    file:write(text)
    file:close();
    --===================================
 
Цитата
Archie_ написал:
вы там никогда такой ереси не услышите, типа " Иди читай мануал " или что то в этом духе
активность на англоязычных форумах очень часто не бескорыстна
люди, и это их право, формируют себе репутацию для последующей монетизации - что также правильно, и мною полностью понимаемо

на наших форумах часто квалифицированные участники дают короткие, но по сути наиценнейшие советы недоученным или просто неученым читателям, экономя им время, силы - делятся знанием, дают маяк и направление
однако в силу недоученности эти читатели, что и логично, не могут быстро оценить суть происходящего

ткчт, Арчи-брат, такого рода специфика на ру-форумах часто вовсе иная - непродуктивное бескорыстие по интимным соображениям пишущего, а вовсе не ...

" ... как образом вы могли бы быть справедливы ко мне? - я выбираю вашу несправедливость ..." (с) "Also sprach Zarathustra"
 
Цитата
Archie_ написал:
А что, проверить расширения у файла, это действительно условие в одну строчку кода.
Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий (Прутков). Из прочего хочу обратить внимание на один рефрен:
Цитата
я не программист
Вы программируете, следовательно в моменте вы программист. Внезапно.
 
Цитата
_sk_ написал:
Anton, Вы меня поражаете своей компетентностью в различных областях в хорошем смысле этого слова! Спасибо за разнообразную помощь и доброжелательное отношение!
Спасибо на добром слове. Хотя порой думается, что помогаю обойти мелкие проблемы на пути к большим.
 
Цитата
Archie_ написал:
nikolz, А теперь обработайте все эти примеры вот этой функцией
Код
       local   function   DeleteAll_Comments (text);
         ---- 
        text  =  text .. '\n';
         local  t,t2,t3,one,two,cmt,x,Rem  =  {},{},{}, 0 , 0 , 0 , 1 , nil ;
         local  boxOpens,box Close ,RemStr  =   0 , 0 , nil ;
         local  SingleLine,boxActiv  =   nil , nil ;
         local  LineCom,LineComM,LineComRemove  =   0 , nil , nil ;
         ---- 
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '\n' ,( ' ' ):rep( 2 ) .. '\n');
         end ;
        text  =   table.concat (t3);
         ---- 
         for  val  in  text:gmatch( "." )  do ;
            t[ # t +  1 ]  =  val;
         end ;
         ---- 
         for  i  =   1 , # t  do ;
             -------------------- 
             if  Rem  then ;
                 local  Cls  =  RemStr:match( '.' ,x);
                 if  Cls  =  =  t[i]  and  x  =  =   # RemStr  then  RemStr  =   nil  Rem  =   nil  Cls =  nil   end ;
                 if  Cls  =  =  t[i]  then  x  =  x  +   1   end ;
                 if  Cls ~ =  t[i]  then  x  =   1   end ;
                t[i]  =   "" ;
             end ;
             -------------------- 
             -------------------- 
             if  LineComRemove  then ;
                 if  t[i] ~ =   '\n'   then ;
                    t[i]  =   "" ;
                 else ;
                    LineComRemove  =   nil ;
                 end ;
             end ;
             -------------------- 
             if  LineCom  =  =   1   and  t[i] ~ =   "-"   then  LineCom  =   0   end ;
             if  one =  =  0   and  two =  =  0   and   not  boxActiv  and   not  Rem  and   not  LineComRemove  then ;
                 if  LineCom  >  =   3   then ; --4 simb>= 
                     if  t[i]  =  =   "["   or  t[i]  =  =   "="   and  LineComM  =  =   1   then ;
                         if  t[i]  =  =   "["   then ;
                            LineCom  =   0 ;
                            LineComM  =   nil ;
                         end ;
                     else ;
                        t[i -  0 ],t[i -  1 ],t[i -  2 ],t[i -  3 ]  =   '' ,'','','';
                        LineComRemove  =   true ;
                        LineCom,LineComM  =   0 , nil ;
                        boxOpens,box Close ,SingleLine,cmt,t2  =   0 , 0 , nil , 0 ,{};
                     end ;
                 end ;
                 if  LineCom  =  =   2   then ;
                    LineCom  =  LineCom +  1 ;
                     if  t[i]  =  =   "["   then  LineComM  =   1   end ;
                 end ;
                 if  t[i]  =  =   "-"   and  LineCom  <   2   and   not  LineComRemove  then ;
                    LineCom  =  LineCom +  1 ;
                 end ;
             end ; 
             if   not  LineComRemove  then ;
             -------------------------------------------------- 
                 -------------------------------------------------- 
                 if  t[i]  =  =   "'"   and  two  =  =   0   and   not  boxActiv  then ;
                     if  one  >   0   then  one  =   0   else  one  =   1   end ;
                 end ;
                 --- 
                 if  t[i]  =  =   '"'   and  one  =  =   0   and   not  boxActiv  then ;
                     if  two  >   0   then  two  =   0   else  two  =   1   end ;
                 end ;
                 --- 
                 if  t[i] ~ =   '['  then  boxOpens  =   0   end ;
                 if  t[i] ~ =   ']'  then  box Close   =   0   end ;
                 if  t[i] ~ =   "-"   then  cmt  =   0   end ;
                 --- 
                 if  t[i]  =  =   '['   and  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and   # t2  <   2   then ;
                    boxOpens  =  boxOpens +  1 ;
                     if  boxOpens  >  =   2   then ;
                        boxOpens  =   0 ;
                        boxActiv  =   true ;
                     end ;
                 end ;
                 ---  
                 if  t[i]  =  =   ']'   and  one  =  =   0   and  two  =  =   0   and  boxActiv  then ;
                    box Close   =  box Close  +  1 ;
                     if  box Close   >  =   2   then ;
                         box Close   =   0 ;
                         boxActiv  =   nil ;
                     end ;
                 end ;
                 --- 
                 if  SingleLine  then  t2[ 1 ],t2[ 2 ]  =   '-' ,' - ' end ;
                
                 if  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and  t[i]  =  =   '-'   then ;
                   cmt  =  cmt  +   1 ;
                    if  cmt  >  =   2   then ; SingleLine  =   true ; cmt =  0   end ;
                 end ;
                 --- 
                 if  SingleLine  and   # t2 >  =  2   then ;
                     if  (t[i]  =  =   '['   or  t[i]  =  =   '=' )  and   # t2  >  =   3   then ;
                        t2[ # t2 +  1 ]  =  t[i];
                     elseif  t[i] ~ =   '['   and  t[i] ~ =   '='   and   # t2  >  =   3   then ;
                       t2  =  {};
                       SingleLine  =   nil ;
                     end ;
                     --- 
                     if  t[i]  =  =   '['   and   # t2 =  =  2   then ;
                        t2[ 3 ]  =  t[i];
                     elseif   # t2  =  =   2   and  t[i] ~ =   '['   then ;
                        t2  =  {};
                        SingleLine  =   nil ;
                     end ;
                     --- 
                     if   # t2  >   3   and  t[i]  =  =   '['   then ;
                        Rem  =   true ;
                         for  ii  =   1 , # t2  do ;
                            t[i - (ii -  1 )]  =   '' ;
                         end ;
                        RemStr  =   table.concat (t2):gsub( '%s' ,''):gsub( '%-' ,''):gsub( '%[' ,']');
                        t2  =  {};
                        SingleLine  =   nil ;
                         if   not  RemStr  or  RemStr =  =  ''   then  Rem  =   nil   end ;
                     end ;
                 end ;
             ------- 
             end ; --LineComRemove 
         end ; --End for #t 
        text  =   table.concat (t);
         ---- 
        t3  =  {};
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '%s%s\n' ,'\n');
         end ;
         ---- 
         return   table.concat (t3);
     end ;
     --=================================== 
    
    
    
     --filename = [[C:\\...]] 
    
     local  file  =   io.open (filename .. '.lua','r');
     if   not  file  then   return   end ;
     local  text  =  file:read( 'a' );
    file:close();
     ----- 
    text  =  DeleteAll_Comments(text);
     ----- 
    file  =   io.open (filename .. '_.lua','w');
    file:write(text)
    file:close();
     --===================================  
  
начнем по порядку
Зачем так агрессивно вести беседу?
Я Вам ничего не должен.
--------------------
теперь по существу.
Сравните размер кода вашего и моего.
------------------
Я написал его за 20 минут на основе своих привычек размещать коммент
--------------------------
Выше я привел как я ставлю многострочный
Ставить закрытие в конце строки как у Вас  по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так  ставить
-------------------------
Но если такие чудики есть, то это легко исправить
Вариант с тестом, содержащим символы выделения, тоже решается просто,
Так как никогда не было такой надобности в таких кусках текста, то об этом не заморачивался
----------------
 
Цитата
nikolz написал:
Зачем так агрессивно вести беседу?Я Вам ничего не должен.
Я агресивно не вел беседу, и не говорил что вы мне что то должны. Просто указал на ошибки.
Цитата
nikolz написал:
Выше я привел как я ставлю многострочный
Ставить закрытие в конце строки как у Вас  по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так  ставить
Дело не в том, что закрытие в конце строки, я же вам потом пример показал, где коммент закрывается в начале строки, а дело в том, что если в многострочном комменте встретятся знаки из вложенного многострочного коммента, то все сломается. Или где то в коде если встретится строка с двумя тире, то тоже все посыпется.
Цитата
nikolz написал:
Но если такие чудики есть, то это легко исправить
Вариант с тестом, содержащим символы выделения, тоже решается просто,
Может быть для вас и просто решается, но я этого не увидел.
Для меня это точно не просто.
-------------------------------------------

В любом случае очень большое спасибо!
Ведь только от вас я увидел здесь реальную помощь (пусть этот код не идеален, но как смогли, так и написали), в отличии от остальных ""помощников"", которые фразу 'иди читай мануал' считают за помощь.
 
вот вариант учитывающий вроде бы ваши желания.
nk_com_v1.lua
-----------------
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua:
--lua  nk_com_v1.lua C:\NK\nk_bot
--------------------
if arg[1] then out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
len=string.len(s1); s=""; x1=0;
m=1; while len>=m do x=string.byte(s1,m)
if x==59 then x=32 end
if x==32 and x==x1 then x1=x; x=0 else
if f==nil then
if n==nil then if x==34 or x==39 then n=x end
else if x==n then n=nil end end
end
if n==nil then z0=string.byte(s1,m+1);
if x==45 and z0==x then
z=string.byte(s1,m+2);   z1=string.byte(s1,m+3);
if f then
if f==1 then if z==93 and z==z1 then f=nil m=m+3; x=0; end end
else if z==91 and z==z1 then f=1 end break;end end
if f then x=0; end
end
x1=x;
end
if x and x>=32 then s=s..string.char(x);x=x1; end
m=m+1;
end
if s and s~="" then out:write(s.."\n") end
end
out:close();
end
--------------------------------------------
если что-то не учитывает то напишите
это тест:
 
Цитата
nikolz написал:
если что-то не учитывает то напишите
это тест:
Все также не справился с этим же многострочным комментарием.
Было:
Код
local bla = 10; 
if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно
--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Получили: (коммент не удалил и часть кода удалил)
Код
local bla = 10 
if bla == 10 then bla = '--' end 
if bla == '--' then val = true end 
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
Ожидалось:
Код
local bla = 10; 
if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


local bla = 15

Второй пример
Было:
Код
--[[ parse me ]]--
function test()
   print("\"--[[")
   print("\"]]--")
end

test()

local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end; -- значение активно


--[==[  чтобы использовать многострочный  коммент используйте знак --[[ для того что бы
открыть многострочный коммент и фразу ]] что бы закрыть 
многострочный  коммент, так же можно использовать вложенные комментарии
для этого используйте знак равенство т.е. 
--[[коммент   --[=[  вложенный коммент --]=] ]]
--]==]

local bla = 15
Получили: (Вообще весь код уничтожен)
Код
ПУСТО!!!!!!!!
Ожидалось:
Код
function test()
   print("\"--[[")
   print("\"]]--")
end

test()

local bla = 10; 

if bla == 10   then bla = '--' end; 
if bla == '--' then val = true end;



local bla = 15
.
Страницы: 1
Читают тему (гостей: 1)
Наверх