Show
Ignore:
Timestamp:
04/12/09 00:34:48 (5 years ago)
Author:
tekisuke
Message:

archeさんのコードをコミット。引数つきマクロが使えるようになりました。ありがとうございます!

Location:
lang/actionscript/flmml/trunk/src
Files:
2 modified

Legend:

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

    r31399 r32278  
    22    import flash.events.EventDispatcher; 
    33    import flash.utils.*; 
     4     
    45    import mx.utils.StringUtil; 
    56 
     
    162163                        if (getChar() == '-') { rv = -1; next(); } 
    163164                        fm = (getUInt(fm) + 1) * rv; 
    164                         if (getChar() == '-') { 
    165                             next(); 
    166                             sf = getUInt(0); 
    167                         } 
     165                    if (getChar() == '-') { 
     166                        next(); 
     167                        sf = getUInt(0); 
     168                    } 
    168169                        if (getChar() == ',') { 
    169170                            next(); 
     
    474475            return -1; 
    475476        } 
    476  
     477/* 09/04/03 arche [DEL] 
    477478        protected function insertLenOrder(idArr:Array, valArr:Array, id:String, val:String):void { 
    478479            var len:int = id.length; 
     
    498499            } 
    499500        } 
    500  
    501501        protected function macroInMacro(str:String, idArr:Array, valArr:Array, id0:String):String { 
    502502            var idx:int; 
     
    520520            return str; 
    521521        } 
     522*/ 
     523 
     524        // 09/04/03 arche [ADD] begin 
     525        protected function replaceMacro(macroTable:Array):void { 
     526            for each(var macro:Object in macroTable){ 
     527                if(m_string.substr(m_letter, macro.id.length) == macro.id){ 
     528                    var start:int = m_letter, last:int = m_letter + macro.id.length, code:String = macro.code; 
     529                    m_letter += macro.id.length; 
     530                    var c:String = getCharNext(); 
     531                    while(StringUtil.isWhitespace(c) || c == ' '){ 
     532                        c = getCharNext(); 
     533                    } 
     534                    var args:Array = new Array(); 
     535                    if(c == "{"){ 
     536                        c = getCharNext(); 
     537                        while(c != "}" && c != ""){ 
     538                            if(c == "$"){ 
     539                                replaceMacro(macroTable); 
     540                            } 
     541                            c = getCharNext(); 
     542                        } 
     543                        last = m_letter; 
     544                        args = m_string.substring(start + macro.id.length + 1, last - 1).split(","); 
     545                    } 
     546                    // 引数への置換 
     547                    for(var i:int = 0; i < code.length; i++){ 
     548                        for(var j:int = 0; j < args.length; j++){ 
     549                                if(j >= macro.args.length){ 
     550                                break; 
     551                                } 
     552                                if(code.substr(i, macro.args[j].id.length + 1) == ("%" + macro.args[j].id)){ 
     553                                code = code.substring(0, i) + code.substring(i).replace("%" + macro.args[j].id, args[macro.args[j].index]); 
     554                                i += args[macro.args[j].index].length - 1; 
     555                                break; 
     556                                } 
     557                        } 
     558                    } 
     559                    m_string = m_string.substring(0, start - 1) + code + m_string.substring(last); 
     560                    m_letter = start - 1; 
     561                    //trace(m_string.substring(m_letter)); 
     562                    break; 
     563                } 
     564            } 
     565        } 
     566        // 09/04/03 arche [ADD] end 
    522567 
    523568        protected function processMacro():void { 
     569            var i:int; 
    524570            // OCTAVE REVERSE 
    525571            var exp:RegExp = /^#OCTAVE\s+REVERSE\s*$/m; 
     
    533579                var matched:Array = m_string.match(exp); 
    534580                if (matched) { 
    535                     for(var i:int = 0; i < matched.length; i++) { 
     581                    for(i = 0; i < matched.length; i++) { 
    536582                        m_string = m_string.replace(exp, ""); 
    537583                        //trace(matched[i]); 
     
    551597            // macro 
    552598            begin(); 
    553             var top:int = 1; 
    554             var idArr:Array = new Array(); 
    555             var valArr:Array = new Array(); 
    556             var last:int; 
    557             // [a-zA-Z][a-zA-Z0-9#\+\(\)_]* 
    558             // ex.) $Am    =/:4a<ce>a:/; 
    559             //      $EonG# =/:4g#b<e>b:/; 
    560             //      $Gm    =/:4gb-<d>b-:/; 
    561             //      $DonF# =/:4f#a<d>a:/; 
    562             //      $Am $EonG# $Gm $DonF# 
     599            // 09/04/03 arche [ADD] begin 
     600            var top:Boolean = true; 
     601            var macroTable:Array = new Array(); 
    563602            while(m_letter < m_string.length) { 
    564603                var c:String = getCharNext(); 
    565604                switch(c) { 
    566                 case '$': 
    567                     // macro definition? 
    568                     if (top) { 
    569                         last = m_string.indexOf(";", m_letter); 
    570                         if (last > m_letter) { 
    571                             var macro:String = m_string.substring(m_letter, last); 
    572                             var token:Array = macro.split("="); 
    573                             if (token.length >= 2 && 
    574                                 token[0].length >= 1) { 
    575                                 var id:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
    576                                 //trace("token:"+token[0]+"/"+id); 
    577                                 if (id != null) { 
    578                                     //trace("macro:$"+id[0]+"="+token[1]); 
    579                                     if (id[0].length > 0) { 
    580                                         m_string = remove(m_string, --m_letter, last); 
    581                                         var idx:int = getIndex(idArr, id[0]); 
    582                                         // first definition 
    583                                         if (idx < 0) { 
    584                                             token[1] = macroInMacro(token[1], idArr, valArr, id[0]); 
    585                                             //trace("define $"+id[i]+"="+token[1]); 
    586                                             insertLenOrder(idArr, valArr, id[0], token[1]); 
    587                                         } 
    588                                         // macro redefinition 
    589                                         else { 
    590                                             token[1] = macroInMacro(token[1], idArr, valArr, id[0]); 
    591                                             //trace("redefine $"+id[i]+"="+token[1]); 
    592                                             valArr[idx] = token[1]; 
    593                                         } 
     605                    case '$': 
     606                        if(top){ 
     607                            var last:int = m_string.indexOf(";", m_letter); 
     608                            if(last > m_letter){ 
     609                                var nameEnd:int = m_string.indexOf("=", m_letter); 
     610                                if(nameEnd > m_letter && nameEnd < last){ 
     611                                    var start:int = m_letter; 
     612                                    var argspos:int = m_string.indexOf("{"); 
     613                                    if(argspos < 0 || argspos >= nameEnd){ 
     614                                        argspos = nameEnd; 
    594615                                    } 
    595                                 } 
     616                                    var regexResult:Array = m_string.substring(start, argspos).match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
     617                                        if(regexResult != null){ 
     618                                            var id:String = regexResult[0]; 
     619                                            if(id.length > 0){ 
     620                                                var args:Array = new Array(); 
     621                                                if(argspos < nameEnd){ 
     622                                                    var argstr:String = m_string.substring(argspos + 1, m_string.indexOf("}", argspos)); 
     623                                                    args = argstr.split(","); 
     624                                                    for(i = 0; i < args.length; i++){ 
     625                                                        var argid:Array = args[i].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); 
     626                                                        args[i] = { id: (argid != null ? argid[0] : ""), index: i }; 
     627                                                    } 
     628                                                    args.sort(function (a:Object, b:Object):int { 
     629                                                        if(a.id.length > b.id.length)  return -1; 
     630                                                        if(a.id.length == b.id.length) return  0; 
     631                                                        return 1; 
     632                                                    }); 
     633                                                } 
     634                                                m_letter = nameEnd + 1; 
     635                                                c = getCharNext(); 
     636                                                while(m_letter < last){ 
     637                                                    if(c == "$"){ 
     638                                                        if(m_string.substr(m_letter, id.length) == id){ 
     639                                                            m_letter--; 
     640                                                            m_string = remove(m_string, m_letter, m_letter + id.length); 
     641                                                            warning(MWarning.RECURSIVE_MACRO, id); 
     642                                                        }else{ 
     643                                                            replaceMacro(macroTable); 
     644                                                        } 
     645                                                        last = m_string.indexOf(";", m_letter); 
     646                                                    } 
     647                                                    c = getCharNext(); 
     648                                                } 
     649                                                var pos:int = 0; 
     650                                                for(; pos < macroTable.length; pos++){ 
     651                                                        if(macroTable[pos].id.length < id.length){ 
     652                                                                break; 
     653                                                        } 
     654                                                } 
     655                                                macroTable.splice(pos, 0, { id: id, code: m_string.substring(nameEnd + 1, last), args: args }); 
     656                                                m_string = remove(m_string, start - 1, last); 
     657                                                m_letter = start - 1; 
     658                                            } 
     659                                    } 
     660                                }else{ 
     661                                    // macro use 
     662                                    replaceMacro(macroTable); 
     663                                    top = false; 
     664                                 } 
     665                            }else{ 
     666                                // macro use 
     667                                replaceMacro(macroTable); 
     668                                top = false; 
    596669                            } 
     670                        }else{ 
    597671                            // macro use 
    598                             else { 
    599                                 replaceMacro(idArr, valArr); 
    600                                 top = 0; 
    601                             } 
     672                            replaceMacro(macroTable); 
     673                            top = false; 
    602674                        } 
    603                         // macro use 
    604                         else { 
    605                             replaceMacro(idArr, valArr); 
    606                             top = 0; 
     675                        break; 
     676                    case ';': 
     677                        top = true; 
     678                        break; 
     679                    default: 
     680                        if(!StringUtil.isWhitespace(c) && c != ' '){ 
     681                            top = false; 
    607682                        } 
    608                     } 
    609                     // macro use 
    610                     else { 
    611                         replaceMacro(idArr, valArr); 
    612                         top = 0; 
    613                     } 
    614                     break; 
    615                 case ';': 
    616                     top = 1; 
    617                     break; 
    618                 default: 
    619                     if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; 
    620                     break; 
    621                 } 
    622             } 
     683                        break; 
     684                } 
     685            } 
     686            // 09/04/03 arche [ADD] end 
    623687        } 
    624688