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
nikolz написал: Зачем так агрессивно вести беседу?Я Вам ничего не должен.
Я агресивно не вел беседу, и не говорил что вы мне что то должны. Просто указал на ошибки.
Цитата
nikolz написал: Выше я привел как я ставлю многострочный Ставить закрытие в конце строки как у Вас по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так ставить
Дело не в том, что закрытие в конце строки, я же вам потом пример показал, где коммент закрывается в начале строки, а дело в том, что если в многострочном комменте встретятся знаки из вложенного многострочного коммента, то все сломается. Или где то в коде если встретится строка с двумя тире, то тоже все посыпется.
Цитата
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();
--===================================
А что, проверить расширения у файла, это действительно условие в одну строчку кода. И даже если не делать всяких этих проверок, и зная что эта функция для очистки комментариев файла.lua и пихать в неё файл с++, как вы написали выше, и при уничтожении этого с++, я считаю, что это не в коем случае не ошибка функции, а тупость человека.
Цитата
Anton написал: Уверен, что есть особенности еще, которые ни вы, ни я не знаем. Речь об этом, а не о конкретном косячке. Впрочем, уже писал, если все устраивает и вы не систему ПРО делаете, то и ладно и хорошо.
Я и не отрицаю что где то могут быть косячки (хотя на ошибки вы мне так и не указали). Повторюсь, что я не программист и я не в состоянии пропарсить весь lua т.к. моих знаний не достаточно в этой области, а функцию охота максимально безошибочную, поэтому я и обратился за помощью на форум(ы), но на всех форумах либо не было ответа, либо предлагались варианты по типу функции nikolz, которые ломались на элементарных вещах. Не дождавшись помощи, я начал пытаться написать ее сам, но опять же вместо помощи(хотя бы в указании ошибок, а не написании кода) я услышал только критику в стили, что за ересь ты делаешь, у тебя вообще все неправильно, читай то, да то. Я даже если это все прочитаю, то я все равно идеально не напишу, повторюсь - потому что я не программист. И если вы хотели/хотите показать какой вы умный в этой области, то взяли бы и помогли физически, а не умничали! А умничать извините, я тоже умею. Могу начитаться в любой области и умничать сидеть, только толку от этого не будет не какого. Ум свой нужно показывать практический, а не технический!!! От вашего технического ума толку не какого нет(в любой области)! ---------- Посидите на Англоязычных форумах, вы там никогда такой ереси не услышите, типа " Иди читай мануал " или что то в этом духе (ну может быть в редких случаях, и то это скорое всего будет Русский человек), там либо помогут (не обязательно физически, а также в прочтении чего нибудь и в этом случае обязательно предоставят ссылочки на не заумные статьи, что бы человек понял о чем речь), либо пройдут мимо, а на Русско Язычных форумах это сплошь - да рядом. Я не знаю, но это Русский народ свою тупость так показывает что ли, или что, я не понимаю. --------- А форум для того и существует, что бы обмениваться и делится информацией, просить помощи и помогать друг другу, а не умничать!!!!!!! А если охота поумничать , то это нужно не на форум, а на лавочку к подъезду (Но Русский наш народ по ходу перепутал эти места). --------- Прошу прощения, если чем то задел, Обидеть не в коем случае не хотел.
Anton написал: Обратите внимание, у вас в коде нет вообще пути "я не буду это парсить". Сунем на вход c++ и скрипт бодренько поудаляет из него все, что ему показалось луа-стайл комментарием.
Про путь это уже обертка и к функции пока не имеет никакого отношения! Про защиту от "не .lua" файла я еще не заморачивался и эта защита пишется в пару строк и за пару минут ! В коде и io.open пока за пределами функции, что бы не мешалась мне и что бы вам при тесте не прописывать их, в конечном варианте io.open будет внутри функции. Суть функции пока состоит в том, чтобы удалить комментарии максимально безболезненно в любой ситуации в lua файле, а не в каком то с++, про защиту - это позже. А как теперь - поломаете ?
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();
--===================================
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();
--===================================
Anton написал: Ваш парсер относится к классу LL(k), при этом грамматика луа леворекурсивная, то есть в принципе всегда можно подобрать такой скрипт, на котором ваш парсер сфейлит. При этом, поскольку он полностью весь луа не парсит, он сам этого не заметит и выдаст мусор (а должен сказать "не понимаю вот эту вот конструкцию"). Вы верно заметили выше, что лучше день потерять, потом за пять минут долететь, только теряете дни не в ту сторону. Писать LL(k) для луа бессмысленно, как его ни усложняй. Парсер должен быть полным и в данном случае построен по принципу рекурсивного спуска, если вы конечно не хотите загнаться и написать GLR, потому что LALR на грамматике из документации тоже не строится, конфликты возникают. Отсюда этапы пути: а) привести грамматику к форме Грейбах; б) доказать, что получилась грамматика, эквивалентная исходной; в) только потом браться за код (по форме Грейбах уже очень просто написать рекурсивный спуск). Или воспользоваться каким-то генератором, хоть яком, хоть бизоном, хоть этим на яве, забыл как его, хотя с ними геморроя будет больше пожалуй, чем при чисто ручном подходе.
Я не программист и все эти ваши слова мне толком ничего не дали, а программистом прочитавши про эти слова сразу я не стану, (хотя знаний и поприбавится, если найду время почитать).)) В предыдущем сообщении я пытался сказать, что в отличии от кода nikolz, мой не ломается на элементарных комментариях. Да - мой код может быть и не красивый с точки зрения программиста, и да - может быть вы и правы, и где то мой код может быть и сфейлит и я этого не отрицаю. Но - но он перебирает весь файл по символьно и вычисляет только комменты вне строк(это важно) и ищет обязательный выход из многострочного коммента по символу входа в него. И как я его не пытался сломать, у меня не получилось и что то мне подсказывает что и не получится, но может я и ошибаюсь и если вам удастся его поломать, то дайти мне знать.
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();
--===================================
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
Комментарий не удален, код унечтожен!!! ----------------------
Так что если код будет очень большой и в коде будут фразы с двумя тире и этих фраз если будет много в коде и не будет копии этого кода, ТО вас за эту функцию (прошу прощения) мало будет прибить. Так как ваша функция уничтожит часть кода.
Скрытый текст
И вам на будущее: Этому вы должны уделять внимание в первую очередь, пусть лучше функция не все удалит / не всех обработает, пускай лучше что то пропустит, чем уничтожит все. Лучше пропустить одного клиента или .... , чем потерять всех!
-- удаляем комментарии и лишние пробелы
--пример вызова для файла 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
Код поломан.
--------------------------------------------------------
Я не спорю, все как то справляются)), но согласись что потратить десять минут вместо сорока к примеру, это лучше, как не крути.
Цитата
Александр М написал: некорректно отрабатывали многострочные комментарии.
Да - при прочитывании кавычек я не учел что где то в однострочном комментарии может находится "одна" кавычка и она ломала весь счет. Исправлено - теперь должно все работать правильно.
Все предыдущие функции выше работают не коректно!
Функция для удаления всех комментариев в файле.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();
--===================================
Александр М написал: По времени гораздо быстрее удалить многострочные вручную, а потом скриптом однострочные, чем писать парсер или искать готовый. Проверено.
А если скрипт в несколько тысяч строк ? Так что плохо проверено, лучше потратить несколько часов (дней может даже) и потом все быстро делать, чем постоянно тратить кучу времени на удаления оных.
--------------------- Функция для удаления всех комментариев в файле.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();
--===================================
Anton написал: А если в файле нет комментариев вообще, то и strpy сработает безошибочно.
Я же написал , что
Цитата
Archie_ написал: Если Учесть что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!
Так что не важно есть комментарии или нет, Функция всегда сработает правильно при условии, что нету много-стр. коммента, если я не прав, то дайте мне знать, на чем она сломалась.
Цитата
Anton написал: Или вы ждали, что вам готовый код дадут в виде вспоможения?
А вы точно читали мое первое сообщение?
Цитата
Archie_ написал: Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, МОЖЕТ БЫТЬ ЕСТЬ У КОГО УЖЕ НАПИСАННАЯ ФУНКЦИЯ. Поиск в Google не дал результатов.
Anton написал: это все колхоз и работать будет только в простых случаях
Если Учесть что в коде нету многострочных комментариев, то эта функция сработает в любой ситуации правильно и без ошибочно !!!
Цитата
Anton написал: Грамматика луа есть в документации, дело за "малым".
Прошу прощения за тавтологию, но ей богу ведёте себя как бабы (прошу прощения, не в коем случае не хочу обидеть вас) , я прекрасно понимаю, что нужно почитать мануал и порыться в гугле, и я этим и занимаюсь, а пока моих знаний недостаточно, поэтому я и попросил тут помощи. Так что если не можете помочь, то пройдите мимо и не умничайте, ну или просто возьмите и помогите.
Для однострочного удалось написать, но он не понимает многострочных и если они* встретятся на пути, то они* будут поломаны. Эта функция сработает правильно, если в строках не будет многострочных комментариев. Теперь осталось написать функцию для удаления во всем коде многострочных комментов, но тут все точно выше моих сил, даже не знаю с какой стороны подойти к этому.
*многострочные
Код
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;
Привет всем! Ребят подскажите пожалуйста, как удалить все комментарии из файла 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 t = { 1.235, 3.215, 4.953, 5.531, 11.845, 14.312, 15.359, 15.498 }
local function nearest(v,tbl);
local x,val;
for i = 1, #tbl do;
local dlt = math.abs(v-tbl[i]);
if not x or dlt < x then;
x = dlt;
val = tbl[i];
end;
end;
return val;
end;
print( nearest( 8 , t ) )
print( nearest( 14.5, t ) )
print( nearest( 2 , t ) )
print( nearest( 2.7 , t ) )
Привет всем! Подскажите пожалуйста, как из таблицы получить значения самое близкое к указанному? То есть: например есть таблица T и есть определенное значение val
Код
T = {1.235,3.215,4.953,5.531,11.845,14.312,15.359,15.498}
val = 12
Так вот, значение val равно 12, значит из таблицы надо вытащить 11.845 если val равно 14,5 , значит из таблицы надо вытащить 14.312 если val равно 2, значит из таблицы надо вытащить 1.235 если val равно 2,7 значит из таблицы надо вытащить 3.215
Привет всем! Подскажите пожалуйста как запихнуть функцию string в таблицу. Таблица нужна для того, что бы функцию положить в модуль. Конечно можно и обойтись без таблицы, но по таблице я еще определяю модуль.
Вот в примере "foo1" в таблице, а "foo2" string, так вот - как эти функции объединить?
Код
T={}
function T.foo1(x)
return string.reverse(x)
end
T.foo1("123") -- вернет 321
function string:foo2()
return string.reverse(self)
end
("123"):foo2() -- вернет 321
Пытаюсь сделать так, но это не работает
Код
T={}
function T.string:foo3()
return string.reverse(self)
end
loadstring() по каким то причинам (не знаю по каким) у меня не работает, но все равно вы меня направили в нужном направлении. Спасибо большое! Решил с помощью load();
Код
local STRING = "5*5+5"
NUMB = load("return "..STRING)();
Привет ребят! Подскажите как строку превратить в математическое выражение, т.е. есть строка "5*5" или "15/3" или "15*7/3" и мне надо получить ответы этих выражений. tonumber() со строками не работает почему то. Подскажите пожалуйста, кто знает, что можно придумать, как выйти из этого положения. Буду раб любым примерам. Спасибо!
Код
--Работает
tonumber(5*5)
--Не работает ((
tonumber("5*5")
Всем Привет! Извините меня за глупый вопрос, но все же спрошу, а вдруг.)) Подскажите пожалуйста, возможно ли в луа как то сокращать записи? Например: Есть у нас функция, которая возвращает одно значение, и мне надо отнять или прибавить к этому значению какую то число, то я делаю вот так
Код
function foo()
local x = 150
return x
end
--------------
bla = foo()-50
а если у нас функция возвращает несколько значений, то вопрос: возможно ли это записать в одну строку, а не так
Код
function foo2()
local x,y,w,h = 150,150,500,300
return x,y,w,h
end
x,y,w,h = foo2()
x,y,w,h = x-50,y-50,w-100,h-100
Привет всем! Подскажите пожалуйста знающие люди, как вернуть из строки точное значение. Есть такая строка(текст) И мне надо вернуть значение строки ID, но match варачивает, в данном случае значение FXID, а как вернуть точное значение ID? Строки могут располагаться в любом порядке.
Код
local x=[[
FXID {88856CCC-783B-4270-B18E-9F80FB9FB319}
IID {14856CCC-783B-4270-B18E-9F80FB9FB319}
ID {1D4F3150-6FC3-42DC-A584-4DC6F925AB7A}
SID {554F3150-6FC3-42DC-A584-4DC6F925AB7A}
]]
Привет всем! Подскажите пожалуйста, возможно ли скриптом lua редактировать архивы .rar,.zip и т.д.? Т.е. есть архив с файлами, и в этом архиве надо отредактировать текстовый документ (имя.txt конечно же известно) Заранее Спасибо!!!
Ребят, подскажите пожалуйста, не как не могу сообразить, как получить из таблицы наиболее повторяющееся число?
например:
Код
T1 = {25,15,25,35,65,25,84,61,25,97,25}
из этой таблицы надо вытащить значения 25
T2 = {15,54,87,15,89,64,15,57,15,96,15}
из этой таблицы надо вытащить значения 15
T3 = {23,55,46,23,23,23,55,23,23,47,23}
из этой таблицы надо вытащить значения 23
Николай Камынин написал: Вы сами поняли что написали?У вас в определении функции Restore() нет формальных параметрова в ее вызове Restore(slot_2) появляются
Я то понял, что написал, а вы если помочь не можете, то и не паясничайте!!! Извините, что в функцию в примере параметр забыл вписать, но вы и так прекрасно все поняли, что я написал, а если не поняли, то так понятней?
Код
function Save (slot)
local t = {}
_G[slot] = t
for i = 1 , количества_чего_то do
t[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore (Slot)
local t = _G[Slot]
for i = 1 , # t do
Set_Моя_Функция_которая_восстанавливает(t[i])
--t[i] = nil -- если надо очистить
end
end
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
function Save(slot)
local t = {}
_G[slot] = t
for i = 1, количества_чего_то do
t[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore()
local t = _G[Slot]
for i = 1, #t do
Set_Моя_Функция_которая_восстанавливает(t[i])
t[i] = nil -- если надо очистить
end
end
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
BlackBoar написал: У таблицы обьявленой внутри функции областью видимости (по определению) будет эта самая функция.
Почему? Я же не локально ее объявил
Цитата
BlackBoar написал: Непонятно какого эффекта вы добиваетесь, вам нужны временные обьекты, вам надо эти таблицы возвращать из функции, еще что-то?Функция например может работать с обьектами обьявленными один раз где-то в начале модуля, как вариант.
Нет возвращать мне не надо, У меня две функции плана Сохранить, восстановить, одна функция запоминает информацию в таблицу, а вторая восстанавливает из таблицы эту информацию
Код
function Save()
Table = {}
for i = 1, количества_чего_то do
Table[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore()
for i = 1, #Table do
Set_Моя_Функция_которая_восстанавливает(Table[i])
end
end
И в процессе работы скрипта сохранений восстановлений может быть целая куча, и я хочу что бы в скобочках объявляемой функции просто прописывался слот и всё Примерно как то так:
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
Сейчас у меня это работает вот так для незапутанного сохранения
Код
function Save()
Table = {}
for i = 1, количества_чего_то do
Table[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore()
for i = 1, #Table do
Set_Моя_Функция_которая_восстанавливает(Table[i])
Table[i] = nil -- если надо очистить
end
end
Код
Save()
код
Restore()
код
Save()
код
Restore()
А вот так для запутанного
Код
slot_1 = {}
Save(slot_1)
код
slot_2 = {}
Save(slot_2)
код
Restore(slot_2)
код
slot_3 = {}
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
И я хочу это превратить в это
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код Restore(slot_1)
Всем Привет! Подскажите пожалуйста возможно ли как то, вот такое реализовать, и если возможно то как ? Есть функция, внутри которой заполняется таблица И возможно ли как то сделать, что бы не писать несколько функций, менять таблицы в функции Например что бы это выглядело примерно как то так.
Код
function Bla(Table)
Table = {}
for i = 1, 10 do
Table[i] = #Table + 1
end
end
Bla(Table_1)
Bla(Table_2)
Bla(Table_3)
Конечно можно сделать вот так
Код
function Bla(Table)
for i = 1, 10 do
Table[i] = #Table + 1
end
end
Table_1 = {}
Bla(Table_1)
Table_2 = {}
Bla(Table_2)
Table_3 = {}
Bla(Table_3)
Но хотелось бы что бы все манипуляции по объявлению таблиц происходили внутри функции и не приходилось каждый раз объявлять таблицу, перед вызовом функции
Привет! Ребят, подскажите пожалуйста, кто знает, как удалить часть строки то есть: есть строка и в ней есть часть в квадратных скобках и/или в круглых скобках и надо удалить то что в скобках и скобки тоже
Код
Here it is not necessary to remove[it should be removed]this is also not necessary to remove
Here it is not necessary to remove[it should be removed]this is also not necessary to remove
Подскажите пожалуйста! Возможно ли скриптом lua найти файл на компьютере. то есть: Известно имя и расширение файла, но неизвестен путь, возможно ли при помощи "LUA" как то просканировать диск "С" и получить путь этого файла ???
Еще вопрос:Подскажите как убрать ковычки. Загоняем строку selX в таблицу
Код
selX = "&true&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false&false"
selT = {}
for S in string.gmatch (selX, "[^&]+") do
if not tonumber(t)then t = 0 end t = t + 1
selT[t]=S
end
на выходе получаем вот такую таблицу со строками вопрос:как превратить строки в таблице в boolean (логический)
Спасибо большое! Что то я вообще туплю, тут и один SaveRest == 1 тоже лишний,Сейчас на свой вопрос посмотрел,аж самому смешно стало,а до этого что то сообразить не мог Спасибо еще раз большое!
Привет Всем! Скажите пожалуйста как правильно написать условие Пишу разными условиями все работает,а если все в одном условии то выдает ошибку "unexpected symbol near '='/неожиданный символ рядом с '='" Что я неправильно делаю,как прописать одним условием?
Код
не работает
if SaveRest == 1 and SaveRest == 1 then selT = {} and timT = {} end
работает
if SaveRest == 1 then selT = {} end
if SaveRest == 1 then timT = {} end
Suntor написал: Ну так как вы написали, только скобки у ф-ций в аргументах уберите, и будет работать.
Так а что прописать в самой функции?
Код
function main(fun_1, fun_2)
if something then
fun_1()--вот здесь что прописать? если прописано fun_1() , то получим ошибку: attempt to call a nil value (local 'fun_1')
else
--fun_2(????????) -- ну и здесь
end
end
Привет всем! Скажите пожалуйста, возможно ли в lua как то организовать вот такое? Есть у нас в коде много функций
Код
function One()
bla
end
---
function Two()
bla
end
---
function Three()
bla
end
---
function Four()
bla
end
---
function Five()
bla
end
---
function Six()
bla
end
---
function Seven()
bla
end
---
далее есть основная функция, здесь я пример очень коротко изобразил,но думаю смысл понятен,где стоят вопросы-туда надо вставлять определенные функции И вот вопрос: возможно ли это реализовать как то с одной функцией
Код
function main(fun_1(???),fun_2(???))
if something then
--fun_1(????????)
else
--fun_2(????????)
end
end
Что бы это выглядело примерно так
Код
if bla_1 then
main(One(),Two())
elseif bla_2 then
main(Three(),Four())
elseif bla_3 then
main(Five(),Four())
elseif bla_4 then
main(Six(),Seven())
elseif bla_5 then
main(Seven(),One())
end