Annotation of parser3/asm.txt, revision 1.1

1.1     ! paf         1:        !literal
        !             2:                push literal
        !             3:        !with_root
        !             4:                push root
        !             5:        !with_self
        !             6:                push self
        !             7:        !with_read
        !             8:                push rcontext
        !             9:        !with_write
        !            10:                push wcontext
        !            11:        !construct
        !            12:                value=pop
        !            13:                name=pop
        !            14:                ncontext=pop
        !            15:                ncontext.put_element(name, value)
        !            16:     !write
        !            17:        value=pop
        !            18:        wcontext.write(value)
        !            19:        !get_element
        !            20:            name=pop
        !            21:                ncontext=pop
        !            22:                value=ncontext.get_element(name) // name бывает method, тогда выдаёт new junction(self:method)
        !            23:                name бывает junction, и если это code-junction, то авто-вычисляет
        !            24:                push value
        !            25:        !get_element_write
        !            26:                optimized push/pop: get_element, write
        !            27:     !create_ewpool
        !            28:                push wcontext
        !            29:                wcontext=new wcontext()
        !            30:        !reduce_ewpool
        !            31:                value=wcontext.value()
        !            32:                wcontext=pop
        !            33:                push value
        !            34:     !create_rwpool
        !            35:        ncontext=pop
        !            36:        push rcontext
        !            37:                rcontext=ncontext
        !            38:                push wcontext
        !            39:                wcontext=new wcontext(ncontext)
        !            40:        !reduce_rwpool
        !            41:                value=wcontext.get_string()
        !            42:                wcontext=pop
        !            43:                rcontext=pop
        !            44:                push value
        !            45:        !get_method_frame
        !            46:            name=pop  // это бывает junction, не name
        !            47:                ncontext=stack[0]
        !            48:                method=ncontext.get_method[self/class?;params;local;code/native_code](name)
        !            49:                unless(method) method=operators.get_method[...;code/native_code](name)
        !            50:         frame=new frame(0, method.params, method.locals);
        !            51:                push frame
        !            52:     !store_param
        !            53:                value=pop
        !            54:                frame=stack[0]
        !            55:                frame.store(value)
        !            56:        !call
        !            57:                frame=pop
        !            58:                ncontext=pop
        !            59:                push root self rcontext wcontext 
        !            60:                left_class=ncontext.get_class()
        !            61:                right_class=frame.self.get_class()
        !            62:                self=f(left_class[thoughts' food], right_self[junction], right_class[static], wcontext.value()[dynamic], new(right_class)[construct])
        !            63:                frame.set_self(self)
        !            64:                root=rcontext=wcontext=frame
        !            65:                code=method.code
        !            66:                execute code
        !            67:                result=wcontext
        !            68:                pop wcontext rcontext self root
        !            69:                push(result)
        !            70:        !
        !            71:        OP_NEG
        !            72:        OP_INV 
        !            73:        OP_NOT  
        !            74:        OP_DEF
        !            75:        OP_IN
        !            76:        OP_FEXISTS
        !            77:                stack[0]=@stack[0]
        !            78:        OP_SUB OP_ADD OP_MUL OP_DIV OP_MOD 
        !            79:        OP_BIN_AND OP_BIN_OR
        !            80:        OP_LOG_AND OP_LOG_OR
        !            81:        OP_NUM_LT OP_NUM_GT OP_NUM_LE OP_NUM_GE OP_NUM_EQ OP_NUM_NE
        !            82:        OP_STR_LT OP_STR_GT OP_STR_LE OP_STR_GE OP_STR_EQ OP_STR_NE
        !            83:        OP_XOR 
        !            84:                b=pop
        !            85:                a=pop
        !            86:                value=a @ b
        !            87:                push value
        !            88:        !create_swpool
        !            89:                push wcontext
        !            90:                wcontext=new wcontext()
        !            91:        !reduce_swpool
        !            92:                value=wcontext.get_string()
        !            93:                wcontext=pop
        !            94:                push value
        !            95: 
        !            96: ----------------------------------------------------------------------------------------------------------------------
        !            97: 
        !            98:     .  ^process(^item[code])
        !            99:        специального ничего не надо, просто внутри запустится ещё раз compile+execute
        !           100:         поставить проверку на бексконечную рекурсию: compile из execute
        !           101:     
        !           102:     !  ${имя}
        !           103:        
        !           104:        !       длывоадфывлопфволрпычспрочалп
        !           105:        >
        !           106:                "длывоадфывлопфволрпычспрочалп"
        !           107:                write
        !           108: 
        !           109:        !       $self.поле
        !           110:        >
        !           111:                with_self
        !           112:                "поле"
        !           113:                get_element
        !           114:                write
        !           115: 
        !           116:        !       $:поле
        !           117:        >
        !           118:                with_root
        !           119:                "поле"
        !           120:                get_element
        !           121:                write
        !           122: 
        !           123:        !       $человек{
        !           124:                        $возраст == $:человек.возраст
        !           125:                }
        !           126:        >
        !           127:                with_read
        !           128:                "человек"
        !           129:                get_element
        !           130:                create_rwpool
        !           131:                code
        !           132:                reduce_rwpool
        !           133:                write
        !           134: 
        !           135: 
        !           136:        !       $человек.$:поле
        !           137:        !       $человек.$поле
        !           138:        >
        !           139:            with_read
        !           140:                "человек"
        !           141:                get_element
        !           142:                create_ewpool
        !           143:                ...write
        !           144:                reduce_ewpool
        !           145:                get_element_write
        !           146: 
        !           147:        !       $человек.возраст
        !           148:        >
        !           149:            with_read
        !           150:                "человек"
        !           151:                get_element
        !           152:                "возраст"
        !           153:                get_element_write
        !           154: 
        !           155:        !       $человек.возраст(^eval[2*2])
        !           156:        >
        !           157:            with_write
        !           158:                "человек"
        !           159:                get_element
        !           160:                "возраст"
        !           161:                create_ewpool
        !           162:                ...write
        !           163:                reduce_ewpool
        !           164:                construct
        !           165:        
        !           166:        !       $возраст(124)
        !           167:        >
        !           168:                with_write
        !           169:                "возраст"
        !           170:                "124"
        !           171:                construct
        !           172: 
        !           173:        !       $человек.возраст(55)
        !           174:        >
        !           175:            with_write
        !           176:                "человек"
        !           177:                get_element
        !           178:                "возраст"
        !           179:                "55"
        !           180:                construct
        !           181: 
        !           182:        !       $:поле(123)
        !           183:        >
        !           184:                with_root
        !           185:                "поле"
        !           186:                123
        !           187:                construct
        !           188: 
        !           189:        !       ^метод{^eval[2*2]}
        !           190:        >
        !           191:            with_read
        !           192:                "метод"
        !           193:                get_method_frame
        !           194:                {code}
        !           195:                create_junction
        !           196:                store_param
        !           197:                call
        !           198:                write
        !           199: 
        !           200:        !       ^метод(48)  [ громкое нет гадости: ^$метод(). пользуйтесь junctions, нефиг безобразия нарушать ]
        !           201:        >
        !           202:            with_read
        !           203:                "метод"
        !           204:                get_method_frame
        !           205:                "48"
        !           206:                store_param
        !           207:                call
        !           208: 
        !           209:        !       ^^ ^$ ^; ^) ^} ^( ^{
        !           210: 
        !           211:        -       ^ifdef(param1;param2)...
        !           212:                
        !           213:        
        !           214:        ?
        !           215:                ^something{^method()}
        !           216:        ?
        !           217:                ^something($method) .... ^method(param)
        !           218:        ?
        !           219:                $a(=;1+2) == %d
        !           220:                $a(%d;1+2)
        !           221:                $a(+-*/;1+2)
        !           222: 
        !           223: 
        !           224:        ?
        !           225:                @sum[a;b][result]
        !           226:                if[;
        !           227:                        $result(^eval[a+b])
        !           228:            ;
        !           229:                ...
        !           230:            ]
        !           231:         ^return($result)
        !           232:            
        !           233:            @main
        !           234: 
        !           235:            -^sum[1;2]-
        !           236: 
        !           237:        -   $результат(=выражение)
        !           238: 
        !           239:        -       $строка.format(%6d)
        !           240: 
        !           241:        !       из instance: $CLASS
        !           242:        !       в class: NAME,PARENTS,STATIC
        !           243:         $CLASS.NAME = полосатая_таблица
        !           244:         $CLASS.PARENTS = (таблица)
        !           245:         $CLASS.STATICS = STATICS hash
        !           246:         $CLASS.field = static.field
        !           247:        !       в class: STATICS, это hash с этими static'ами
        !           248:                
        !           249:        ?       $переменная(^имя_класса:имя_конструктора(параметр1;параметр2))
        !           250:                with_write
        !           251:                ...параметры...
        !           252:                new "имя_класса" "имя_конструктора" [leaves VObject on stack]
        !           253:                construct
        !           254: 
        !           255:        ?       $переменная(^имя_класса:имя_конструктора(параметр))
        !           256:                with_write
        !           257:         vclass("имя_класса")
        !           258:         "имя_конструктора"
        !           259:                get_class_method_frame
        !           260:                "параметр"
        !           261:                store_param
        !           262:                call [leaves VObject on stack?]
        !           263:                construct
        !           264: 
        !           265:        !       $переменная(^имя_класса:имя_конструктора(параметр))
        !           266:        -
        !           267:                with_write
        !           268:                !
        !           269:         vclass("имя_класса")  [вместо обычного with_read!]
        !           270:         "имя_конструктора"
        !           271:         get_element
        !           272:                get_method_frame
        !           273:                "параметр"
        !           274:                store_param
        !           275:                [methodframe is wcontext(vobject(vclass))] call [wcontext.write(value) // value == VObject]
        !           276:                !
        !           277:                construct
        !           278: 
        !           279:                        VClass *context_class=awcontext.get_class();
        !           280:             VClass *called_class=junction.self.get_class();
        !           281:             // переменной уже назначен класс?
        !           282:                        if(context_class) { // да
        !           283:                                // это я или мой родитель? 
        !           284:                                if(context_class.is_or_derived_from(called_class)) // да
        !           285:                                        self=junction.self; // dynamic call
        !           286:                                else // нет
        !           287:                                        self=called_class; // static call
        !           288:                        } else { // нет -- constructor: $some(^class:method[..]) call
        !           289:                                self=new VObject(pool, called_class); // 'self' := new instance of 'class:'
        !           290:                                method_frame.write(self);
        !           291:                        }
        !           292:                        method_frame.set_self(self);
        !           293: 
        !           294:        !       $имя_класса:переменная
        !           295:        -
        !           296:                очевидно
        !           297: 
        !           298: 
        !           299:        !       выражение
        !           300:                $a+$b*$c
        !           301:                ^sin($a)        
        !           302:                ^test($a;$b)
        !           303: 
        !           304:          0     
        !           305:                - + * / Арифметические выражения вычитания, сложения, умножения и деления соответственно
        !           306:                %       Остаток от деления. Но -11%2=-1
        !           307:                ~       Битовая инверсия
        !           308:                ^       XOR
        !           309:                & |     Битовые операции AND и OR соответственно
        !           310:                && ||   Логические операции AND и OR соответственно
        !           311:                < > <= >= == != Знаки "меньше", "больше", "меньше или равно", "больше или равно", "равно", "не равно" соответственно.
        !           312:                !       Логический NOT
        !           313:                Round() Операция округления.round(-1.23)=-1, round(-1.58)=-2, round(1.58)=2
        !           314:                floor() Операция округления в меньшую сторону.floor(1.23)=1, floor(-1.23)=-2
        !           315:                ceiling()       Операция округления в большую сторону.ceiling(1.23)=2, ceiling(-1.23)=-1
        !           316:                abs()   abs(1.23)=1.23, abs(-1.23)=1.23
        !           317:                sign()  Знак выражения.sign(1.23)=1, sign(0)=0, sign(-1.23)=-1
        !           318:          +     
        !           319:            def для проверки defined,
        !           320:                eq ne lt gt le ge для сравнения строк, 
        !           321:                in /dir/ для проверки[раньше ^start],
        !           322:                -f для проверки существования файла на диске,
        !           323:                строка в кавычках - строка, без кавычек строка до 
        !           324:                        ближайшего whitespace
        !           325:        >       
        !           326:                literal (VString  or  VDouble)
        !           327:                OP_NEG
        !           328:                OP_SUB OP_ADD OP_MUL OP_DIV OP_MOD 
        !           329:                OP_INV  
        !           330:                OP_BIN_AND OP_BIN_OR
        !           331:                OP_LOG_AND OP_LOG_OR
        !           332:                OP_NUM_LT OP_NUM_GT OP_NUM_LE OP_NUM_GE OP_NUM_EQ OP_NUM_NE
        !           333:                OP_STR_LT OP_STR_GT OP_STR_LE OP_STR_GE OP_STR_EQ OP_STR_NE
        !           334:                OP_NOT  
        !           335:                OP_DEF
        !           336:                OP_IN
        !           337:                OP_FEXISTS
        !           338:                create_swpool
        !           339:                для "... ..."" ..."
        !           340:                reduce_swpool
        !           341: 
        !           342: 
        !           343: 
        !           344: 
        !           345: 

E-mail: