Получился вот такой класс. Парсит в объект и обратно. Думаю, можно в коллекцию.
class NEI {
Parse(input) {
obj:=[]
curObj:=obj,objStack:=[],objStack.Push(curObj)
curTab:=prevLine:=prevTab:=-1
Loop, Parse, input, `n, `r
{
if(!RegExMatch(A_LoopField, "^(?<tab>`t*)(?<line>.*)", _) || !_line || RegExMatch(_line,"^(\s{0,})\/\/")) ;empty line or "//"
Continue
StrReplace(_tab, A_Tab, "", tab)
if(curTab=-1) {
curTab:=0,prevLine:=_line
if(prevTab:=tab) ;line starts with TAB and has't obj-parent
return -1
Continue
} if(tab-curTab<0) { ;prev level
curObj.Push(prevLine)
loop % Abs(tab-curTab)
objStack.Pop() ;remove last object
curObj:=objStack[objStack.MaxIndex()]
}
if(tab=prevTab) ;curr level
curObj.Push(prevLine)
else if(tab>prevTab) ;new level
curObj[prevLine]:=[]
,curObj:=curObj[prevLine]
,objStack.Push(curObj)
,curTab:=tab
else if(prevTab-tab>1)
curObj[_line]:=[],curObj:=curObj[_line],objStack.Push(curObj)
prevLine:=_line,prevTab:=tab
} curObj.Push(prevLine)
return obj
}
Dump(obj,tab=0) {
if(!isObject(obj))
return -1
out:=""
for i,v in obj {
if(isObject(v))
out.=this._mult_tab(tab) i "`n" this.Dump(v,tab+1)
out.=this._mult_tab(tab) v (A_Index=obj.MaxIndex()?"":"`n")
} return out
}
_mult_tab(i) {
out:=""
loop % i
out.=A_Tab
return out
}
}
Замерил время парсинга:
Размер файла: 94 569 байт.
Кол-во символов: 51 607 (unicode)
Ваш скрипт: 15мс.
Скрипт из данного поста: 16мс.
+1мс за счет проверки на возможные комментарии в файле.
Покинул форум