Привет всем! Ребят подскажите пожалуйста, как удалить все комментарии из файла 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 не дал результатов.
Александр М написал: По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ? Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.
--------------------- Функция для удаления всех комментариев в файле.lua, может кому пригодится.
Скрытый текст
Код
local function DeleteAll_Comments(text);
----
local t,t2,one,two,cmt,x,Rem = {},{},0,0,0,1,nil;
local boxOpens,boxClose,RemStr = 0,0,nil;
local SingleLine,boxActiv = nil,nil;
----
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 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 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;--End for #t
text = table.concat(t);
----------------------
local t = {};
for str in text:gmatch(".-\n") do;
----
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;
t[#t+1]=Str;
end;
return table.concat(t);
end;
--===================================
filename = [[C:\\...]]
local file = io.open(filename,'r');
if not file then return end;
local text = file:read('a');
file:close();
-----
text = DeleteAll_Comments(text);
-----
file = io.open(filename,'w');
file:write(text)
file:close();
--===================================
Александр М написал: По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ? Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.
--------------------- Функция для удаления всех комментариев в файле.lua , может кому пригодится.
Скрытый текст
Код
...
--===================================
Все мои роботы из нескольких тысяч строк, но как-то справляюсь. :) Плагины, что я проверял, некорректно отрабатывали многострочные комментарии.
Я не спорю, все как то справляются)), но согласись что потратить десять минут вместо сорока к примеру, это лучше, как не крути.
Цитата
Александр М написал: некорректно отрабатывали многострочные комментарии.
Да - при прочитывании кавычек я не учел что где то в однострочном комментарии может находится "одна" кавычка и она ломала весь счет. Исправлено - теперь должно все работать правильно.
Все предыдущие функции выше работают не коректно!
Функция для удаления всех комментариев в файле.lua,
Скрытый текст
Если обнаружите какие либо ошибки в работе, то дайте знать.
Код
--===========================================================
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 = 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,'r');
if not file then return end;
local text = file:read('a');
file:close();
-----
text = DeleteAll_Comments(text);
-----
file = io.open(filename,'w');
file:write(text)
file:close();
--===================================
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
-- удаляем комментарии и лишние пробелы
--пример вызова для файла 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-м сообщении код вроде коректно работает, пока ошибок не обнаружено) В моем первом сообщении есть примеры комментариев, так ваш код не один комментарий не обработал коректно.
Вот примеры ошибок вашего кода:
Скрытый текст
Код
код-комментарий:
if bla then bla = '--' end -- коммент
Полученный результат:
if bla then bla = '
Код поломан.
'-------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
код-комментарий: тоже самое, что и в предыдущем примере.
if bla then bla = 'D --' end -- коммент
Полученный результат:
if bla then bla = 'D
Код поломан.
'-------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
код-комментарий:
--[[ bla bla bla bla bla --[==[ bla bla bla
bla bla bla bla -- bla bla bla -- bla bla --]=] bla
bla bla bla bla --]]
Полученный результат:
bla bla bla bla
bla bla bla bla
комментарий не удален полностью и сделал код не рабочий, но хоть не поломал его (требуется ручная чистка)
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
код-комментарий:
--[==[ 123456789
--]]
987654321
--]==]
Полученный результат:
987654321
комментарий не удален полностью и сделал код не рабочий, но хоть не поломал его (требуется ручная чистка)
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
код-комментарий:
Get_Bla(arg1--[[bla]],arg2--[[bla]],arg3--[[bla]],arg4--[[bla]]) -- коммент
Полученный результат:
Get_Bla(arg1
Код унечтожен
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
код-комментарий:
Get_Bla(arg1--[[bla]],
arg2--[[bla]],
arg3--[[bla]],
arg4--[[bla]]) -- коммент
Полученный результат:
Get_Bla(arg1
arg2
arg3
arg4
Код поломан.
--------------------------------------------------------
могу выложить скрипт до и после объем скрипта 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()
Код
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();
--===================================
Это экстенсивный путь программирования. Обратите внимание, у вас в коде нет вообще пути "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием. Ну, не запустит ракеты на воронеж, и то спасибо. Хотя кто знает, точно ли не запустит. В общем, где-то когда-то как-то оно все будет работать, если этого достаточно, то и ладно.
Anton написал: Обратите внимание, у вас в коде нет вообще пути "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием.
Про путь это уже обертка и к функции пока не имеет никакого отношения! Про защиту от "не .lua" файла я еще не заморачивался и эта защита пишется в пару строк и за пару минут ! В коде и io.open пока за пределами функции, что бы не мешалась мне и что бы вам при тесте не прописывать их, в конечном варианте io.open будет внутри функции. Суть функции пока состоит в том, чтобы удалить комментарии максимально безболезненно в любой ситуации в lua файле, а не в каком то с++, про защиту - это позже. А как теперь - поломаете ?
Я и первый раз цели поломать не ставил, а хотел показать, что вот упустили какую-то особенность и вуаля. Уверен, что есть особенности еще, которые ни вы, ни я не знаем. Речь об этом, а не о конкретном косячке. Впрочем, уже писал, если все устраивает и вы не систему ПРО делаете, то и ладно и хорошо.
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