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: