Changeset 2138

Show
Ignore:
Timestamp:
11/29/07 09:07:08 (6 years ago)
Author:
tekisuke
Message:

lang/actionscript/flmml/:
マクロの処理を素直な流れに変更

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/actionscript/flmml/trunk/src/com/txt_nifty/sketch/flmml/MML.as

    r2009 r2138  
    227227        } 
    228228 
    229         protected function next():void { 
    230             m_letter++; 
     229        protected function next(i:int = 1):void { 
     230            m_letter += 1; 
    231231        } 
    232232 
     
    353353        } 
    354354 
    355         protected function replaceMacro(str:String, startIndex:int, id:String, val:String):String { 
    356             var letter:int = startIndex; 
    357             var top:int = 1; 
    358             loop : while(letter < str.length) { 
    359                 var c:String = str.charAt(letter++); 
    360                 switch(c) { 
    361                 case '$': 
    362                     // defining macro? 
    363                     if (top) { 
    364                         var last:int = str.indexOf(";", letter); 
    365                         if (last > letter) { 
    366                             var macro:String = str.substring(letter, last); 
    367                             var token:Array = macro.split("="); 
    368                             if (token.length >= 2 && 
    369                                 token[0].length >= 1) { 
    370                                 var ids:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
    371                                 // same macro -> replace 
    372                                 if ((ids != null) && ids[0] == id) { 
    373                                     val = token[1]; 
    374                                     str = remove(str, --letter, last); 
    375                                 } 
    376                                 // other macro -> skip identifier 
    377                                 else { 
    378                                     letter += token[0].length; 
    379                                 } 
    380                             } 
    381                         } 
    382                     } 
    383                     // replace 
    384                     if (str.substr(letter, id.length) == id) { 
    385                         str = str.substring(0, letter-1) + val + str.substring(letter + id.length); 
    386                         letter += id.length; 
    387                     } 
    388                     top = 0; 
    389                     break; 
    390                 case ';': 
    391                     top = 1; 
    392                     break; 
    393                 default: 
    394                     if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 
    395                     break; 
     355        protected function getIndex(idArr:Array, id:String):int { 
     356            for(var i:int = 0; i < idArr.length; i++) 
     357                if (((String)(idArr[i])) == id) return i; 
     358            return -1; 
     359        } 
     360 
     361        protected function insertLenOrder(idArr:Array, valArr:Array, id:String, val:String):void { 
     362            var len:int = id.length; 
     363            var i:int; 
     364            for(i = 0; i < idArr.length; i++) { 
     365                if (len >= ((String)(idArr[i])).length) break; 
     366            } 
     367            idArr.splice(i, 0, id); 
     368            valArr.splice(i, 0, val); 
     369        } 
     370 
     371        protected function replaceMacro(idArr:Array, valArr:Array):void { 
     372            var i:int; 
     373            for(i = 0; i < idArr.length; i++) { 
     374                var id:String = idArr[i]; 
     375                if (m_string.substr(m_letter, id.length) == idArr[i]) { 
     376                    //trace("["+m_string.substr(m_letter, id.length)+"]"); 
     377                    m_string = m_string.substring(0, m_letter-1) + valArr[i] + m_string.substring(m_letter + id.length); 
     378                    m_letter += id.length; 
     379                    break; 
     380                } 
     381            } 
     382        } 
     383 
     384        protected function macroInMacro(str:String, idArr:Array, valArr:Array):String { 
     385            for(var i:int = 0; i < idArr.length; i++) { 
     386                var id:String = "$"+idArr[i]; 
     387                //trace("id:"+id); 
     388                var idx:int = str.indexOf(id); 
     389                while(idx >= 0) { 
     390                    str = str.substring(0, idx-1) + valArr[i] + str.substring(idx + id.length); 
     391                    idx = str.indexOf(id, idx); 
    396392                } 
    397393            } 
    398394            return str; 
    399         } 
    400  
    401         protected function quickSort(idArr:Array, valArr:Array, begin:int, end:int):void { 
    402             if (begin >= end) return; 
    403             var i:int, j:int; 
    404             var tmp:String; 
    405             var pivot:int = ((String)(idArr[(int)((begin + end) / 2)])).length; 
    406             i = begin; 
    407             j = end; 
    408             while(1) { 
    409                 while(((String)(idArr[i])).length < pivot) ++i; 
    410                 while(((String)(idArr[j])).length > pivot) --j; 
    411                 if (i >= j) break; 
    412                 tmp = idArr[i]; 
    413                 idArr[i] = idArr[j]; 
    414                 idArr[j] = tmp; 
    415                 tmp = valArr[i]; 
    416                 valArr[i] = valArr[j]; 
    417                 valArr[j] = tmp; 
    418                 i++; 
    419                 j--; 
    420             } 
    421             if (begin < i - 1) quickSort(idArr, valArr, begin, i - 1); 
    422             if (j + 1 < end)   quickSort(idArr, valArr, j + 1, end); 
    423         } 
    424  
    425         protected function lengthSort(idArr:Array, valArr:Array):void { 
    426             quickSort(idArr, valArr, 0, idArr.length-1); 
    427395        } 
    428396 
     
    444412                switch(c) { 
    445413                case '$': 
     414                    // macro definition? 
    446415                    if (top) { 
    447416                        var last:int = m_string.indexOf(";", m_letter); 
     
    456425                                    //trace("macro:$"+id[0]+"="+token[1]); 
    457426                                    if (id[0].length > 0) { 
    458                                         var f:int = 0; 
    459                                         for(i = 0; i < idArr.length; i++) { 
    460                                             if (idArr[i] == id[0]) { f = 1; break; } 
     427                                        m_string = remove(m_string, --m_letter, last); 
     428                                        var idx:int = getIndex(idArr, id[0]); 
     429                                        // first definition 
     430                                        if (idx < 0) { 
     431                                            token[1] = macroInMacro(token[1], idArr, valArr); 
     432                                            //trace("define $"+id[i]+"="+token[1]); 
     433                                            insertLenOrder(idArr, valArr, id[i], token[1]); 
    461434                                        } 
    462                                         // first definition 
    463                                         if (f == 0) { 
    464                                             m_string = remove(m_string, --m_letter, last); 
    465                                             idArr[idArr.length] = id[0]; 
    466                                             valArr[valArr.length] = token[1]; 
     435                                        // macro redefinition 
     436                                        else { 
     437                                            token[1] = macroInMacro(token[1], idArr, valArr); 
     438                                            //trace("redefine $"+id[i]+"="+token[1]); 
     439                                            valArr[idx] = token[1]; 
    467440                                        } 
    468441                                    } 
    469442                                } 
    470443                            } 
     444                            // macro use 
     445                            else { 
     446                                replaceMacro(idArr, valArr); 
     447                            } 
    471448                        } 
     449                        // macro use 
     450                        else { 
     451                            replaceMacro(idArr, valArr); 
     452                        } 
     453                    } 
     454                    // macro use 
     455                    else { 
     456                        replaceMacro(idArr, valArr); 
    472457                    } 
    473458                    break; 
     
    479464                    break; 
    480465                } 
    481             } 
    482             lengthSort(idArr, valArr); 
    483             for(i = idArr.length-1; i >= 0; i--) { 
    484                 //trace("macro["+idArr[i]+"]"+valArr[i]); 
    485                 for(var j:int = 0; j < valArr.length; j++) { 
    486                     if (i != j) valArr[j] = replaceMacro(valArr[j], 0, idArr[i], valArr[i]); 
    487                 } 
    488                 m_string = replaceMacro(m_string, 0, idArr[i], valArr[i]); 
    489466            } 
    490467        }