diff --git a/lib/modules/Parser.pmod/C.pmod b/lib/modules/Parser.pmod/C.pmod index 13064efabb248944fa97819bdcf92a84944d0bfb..2e102c2d4bb964611bbe3f8a3e090aade54bc0f4 100644 --- a/lib/modules/Parser.pmod/C.pmod +++ b/lib/modules/Parser.pmod/C.pmod @@ -1,4 +1,4 @@ -mapping(string:string) global_groupings=(["}":"{",")":"(","]":"["]); +mapping(string:string) global_groupings=(["{":"}","(":")","[":"]"]); array(string) split(string data) { @@ -259,21 +259,25 @@ array(Token) tokenize(array(string) s, void|string file) array group(array(string|Token) tokens, void|mapping groupings) { + Stack.stack stack=Stack.stack(); array(Token) ret=({}); + mapping actions=([]); + if(!groupings) groupings=global_groupings; + + foreach((array)groupings,[string x, string y]) + { + actions[x]=1; + actions[y]=2; + } + foreach(tokens, Token token) { - ret+=({ token }); - if(string rev=groupings [ (string)token ]) + switch(actions[(string)token]) { - for(int q=sizeof(ret)-1;q>=0;q--) - { - if(ret[q] == rev) - { - ret=ret[..q-1]+({ ret[q..] }); - break; - } - } + case 0: ret+=({token}); break; + case 1: stack->push(ret); ret=({token}); break; + case 2: ret=stack->pop()+({ ret + ({token}) }); } } return ret;