-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathel compilador.llano
6267 lines (5649 loc) · 256 KB
/
el compilador.llano
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\ el compiler (el compilador) copyright © 2006, 2017, 2018 el osmosian order y Pablo Cayuela (SAL-1016)
\ firstparam=esp+4/ebp+8, secondparam=esp+8/ebp+12, etc...
Para ejecutar:
Poner en marcha.
Initialize el compiler.
Hacer todo.
\Handle events.
Finalize el compiler.
Escribir el crlf string luego "Operación completada." luego el crlf string para StdOut.
Shut down.
Para hacer todo:
Poner 1252 into a número called codepage. \
Llamar "kernel32.dll" "SetConsoleOutputCP" con the codepage retornando a número called status de erro.
Si el status de erro es 0 [NULL],
Escribir "Error al configurar Console CodePage en STDOUT." luego the crlf string para STDOUT.
Obtener una string called Endereço Da Pasta desde the argumentos da linha de comando.
Si el Endereço Da Pasta está blank,
Escribir "--------------------------------------------------------------------------------------------------------------- " luego the crlf string para StdOut;
Escribir "Aviso. Para utilizar este compilador utilice la siguiente sintaxis:" luego the crlf string para StdOut;
Escribir " " luego the crlf string para Stdout;
Escribir "c:\el compilador.exe " luego " c:\pasta_do_projeto_atual\ " luego the crlf string para StdOut;
Salir.
Si the Endereço Da Pasta's last byte puntero's contenido no es el backslash byte,
Adjuntar the backslash byte to the Endereço Da Pasta.
Si el Endereço Da Pasta no está in el file system,
Escribir "Error. El directorio '" luego el Endereço Da Pasta luego "' no fue encontrado." luego the crlf string para StdOut;
Salir.
Escribir "Compilando el directorio '" luego el Endereço Da Pasta luego "' ..." luego the crlf string para StdOut. \ #0
Escribir the crlf string para StdOut.
Compilar el Endereço Da Pasta. \ <----------------------------------------------------------------------------
Si el compiler's abortar flag es set,
Mostrar el error de compilación;
Salir.
Escribir "Tiempo de compilación: " luego the compiler's timer's string luego " ms" luego the crlf string para StdOut.
Para Mostrar el error de compilación:
Cloquear.
Si el compiler's abortar path es blank,
Escribir el compiler's abortar message para StdOut;
Salir.
Escribir
El compiler's abortar message luego " - "
luego el compiler's abortar path
luego ". Línea: "
luego el compiler's abortar row#
para StdOut.
Escribir el crlf string para StdOut.
Para obtener una string desde the argumentos da linha de comando:
Llamar "kernel32.dll" "GetCommandLineA"
retornando un pchar. [pchar]
Convertir el pchar to una string called argumentos.
Colocar un substring on las argumentos.
Lazo.
Si el substring es blank,
Borrar el string;
Salir.
Si el substring's first byte puntero's contenido is not the space byte,
Agregar 1 to the substring's first byte puntero;
Repeat.
Poner the substring into the string.
Eliminar any leading noise desde the string.
Eliminar any trailing noise desde the string.
\Eliminar el ruido iniciales de la string.
\Eliminar el ruido al final de la string.
\Reitere.
Para handle events:
\Deque un event.
\Si el event es nil, salir.
\Handle el event.
\Repetir.
Para initialize:
\Initialize el desktop.
\Initialize el finder.
\Initialize el editor.
\Initialize el writer.
\Initialize el compiler.
\Fill el tabs.
\Switch to el tabs' first.
Para finalize:
\Destroy el tabs.
Finalize el compiler.
\Finalize el writer.
\Finalize el editor.
\Finalize el finder.
\Finalize el desktop.
An abortar message es un string.
Para abortar con un string:
Si el compiler's abortar flag es set, salir.
Definir el compiler's abortar flag.
Poner el string into el compiler's abortar message.
Para abortar con un string y un byte puntero:
Si el compiler's abortar flag es set, salir.
Definir el compiler's abortar flag.
Poner el string into el compiler's abortar message.
Encontrar el compiler's abortar path y el compiler's abortar row# usando el byte puntero.
Si el compiler's abortar path es blank, salir.
Extraer un file name desde el compiler's abortar path.
Anteponer "Error en " luego el file name luego ". " to el compiler's abortar message.
Para abortar con un string y un rider:
Si el rider's token es not blank,
Abortar con el string y el rider's token's first;
Salir.
Abortar con el string y el rider's source's last.
Para agregar el allocate and deallocate and finalize and destroy routines:
Si el compiler's abortar flag es set, salir.
Obtener un type desde el types.
Si el type es nil, salir.
Agregar el finalize routine for el type.
Agregar el allocate routine for el type.
Agregar el deallocate routine for el type.
Agregar el destroy routine for el type.
Repetir.
Para agregar el allocate routine for un type:
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Si el type cannot be reduced to "puntero", salir.
Si el type's contenido type es nil, salir.
Agregar un routine to el routines usando nil.
Adjuntar "Allocate memory for un " luego el type's name to el routine's header string. \ TRADUZIR
Adjuntar "Assign el " luego el type's name luego " usando " to el routine's body string. \ TRADUZIR
Adjuntar el type's contenido type's length luego "." to el routine's body string.
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar and compilar el initialize before run and run and finalize after run routine:
Si el compiler's abortar flag es set, salir.
Agregar un routine to el routines usando nil.
Adjuntar "~Initialize before run and Run and Finalize after run" to el routine's header string.
Adjuntar "Initialize before run. " to el routine's body string.
Adjuntar el global initializers to el routine's body string.
Adjuntar "Ejecutar. " to el routine's body string.
Adjuntar el global finalizers to el routine's body string.
Adjuntar "Finalize after run. " to el routine's body string.
Adjuntar "Llamar ""kernel32.dll"" ""ExitProcess"" con 0. " to el routine's body string.
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Compilar el body of el routine.
Para agregar un built-in type usando un name y un plural name y un length:
Agregar el built-in type to el types usando el name y el plural name y el name.
Poner el length into el built-in type's length.
Poner el built-in type into el built-in type's base type.
Indexar el built-in type.
Para agregar el built-in types:
Agregar un built-in type usando "byte" and "bytes" y 1 .
Agregar another built-in type usando "registro" and "registros" and 0.
Para agregar el deallocate routine for un type:
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Si el type cannot be reduced to "puntero", salir. \ TRADUZIR
Si el type's contenido type es nil, salir.
Agregar un routine to el routines usando nil.
Adjuntar "Deallocate un " luego el type's name to el routine's header string. \ TRADUZIR
Adjuntar "Si el " luego el type's name luego " es nil, salir. " to el routine's body string.
Si el type's contenido type should be finalized,
Adjuntar "~Finalize el " luego el type's name luego "'s contenido. " to el routine's body string. \ TRADUZIR
Adjuntar "Unassign el " luego el type's name luego "." to el routine's body string.
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar el destroy routine for un type:
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Si el type should not be forgotten, salir.
Si el type can be reduced to "listas",
Agregar el destroy routine for el type (listas);
Salir. \ TRADUZIR
Si el type can be reduced to "puntero",
Agregar el destroy routine for el type (puntero);
Salir.
Para agregar el destroy routine for un type (puntero):
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Poner "Destroy [" luego el type's name luego "]" into un moniker. \ TRADUZIR
Si el moniker es in el routine index, salir.
Agregar un routine to el routines usando nil.
Adjuntar "Destroy un " luego el type's name to el routine's header string. \ TRADUZIR
Adjuntar "Si el " luego el type's name luego " es nil, salir. " to el routine's body string.
Si el type's contenido type can be reduced to "puntero",
Adjuntar "Destroy el " luego el type's name luego "'s contenido. " to el routine's body string. \ TRADUZIR
Si el type's contenido type can be reduced to "listas",
Adjuntar "Destroy el " luego el type's name luego "'s contenido. " to el routine's body string. \ TRADUZIR
Lazo.
Obtener un field desde el type's contenido type's fields.
Si el field es nil, interrumpir.
Si el field's reference flag es set, repetir.
Si el field's type should not be forgotten, repetir.
Adjuntar "Destroy el " luego el type's name luego "'s " luego el field's name luego ". " to el routine's body string. \ TRADUZIR
Repetir.
Adjuntar "Deallocate el " luego el type's name luego ". " to el routine's body string. \ TRADUZIR
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar el destroy routine for un type (listas):
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Si el type's fields' first es nil,
Abortar con "Internal error - Agregar el forget routine for un type (listas)";
Salir.
Si el type's fields' first's type es nil,
Abortar con "Internal error 2 - Agregar el forget routine for un type (listas)";
Salir.
Poner "Destroy [" luego el type's name luego "]" into un moniker.
Si el moniker es in el routine index, salir.
Agregar un routine to el routines usando nil.
Adjuntar "Destroy un " luego el type's name to el routine's header string.
Adjuntar "Si el " luego el type's name luego "'s first es nil, salir. " to el routine's body string.
Poner el type's fields' first's type's name into un name.
Adjuntar "Poner el " luego el type's name luego "'s first into un " luego el name luego ". " to el routine's body string.
Adjuntar "Eliminar el " luego el name luego " desde el " luego el type's name luego ". " to el routine's body string.
Adjuntar "Destroy el " luego el name luego ". " to el routine's body string.
Adjuntar "Repetir. " to el routine's body string.
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar un entry to some imports usando un import name y un entry name:
Encontrar un import usando el import name.
Si el import es nil,
Agregar el import to el imports usando el import name.
Encontrar el entry usando el entry name y el import's entries.
Si el entry es not nil, salir.
Crear el entry.
Adjuntar el entry to el import's entries.
Poner el entry name into el entry's name.
Para agregar un field to some fields usando un name y un nickname y un type name y un reference flag:
Agregar el field to el fields usando "field" and nil.
Poner el name into el field's name.
Poner el nickname into el field's nickname.
Poner el type name into el field's type name.
Poner el reference flag into el field's reference flag.
Para agregar el finalize routine for un type:
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Si el type should not be finalized, salir.
Si el type's name es "string",
Agregar el finalize routine for el type (string);
Salir.
Si el type can be reduced to "string", salir. \ prevents generation of finalizer for derived string types
Agregar el finalize routine for el type (registro).
Para agregar el finalize routine for un type (registro):
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Agregar un routine to el routines usando nil.
Adjuntar "~Finalize un " luego el type's name to el routine's header string.
Adjuntar "Intel $50. " to el routine's body string. \ push eax
Lazo.
Obtener un field desde el type's fields.
Si el field es nil, interrumpir.
Si el field's type should not be finalized, repetir.
Adjuntar "~Finalize el " luego el type's name luego "'s " luego el field's name luego ". " to el routine's body string.
Repetir.
Adjuntar "Intel $58." to el routine's body string. \ pop eax
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar el finalize routine for un type (string):
Si el type es nil, salir.
Si el compiler's abortar flag es set, salir.
Agregar un routine to el routines usando nil.
Adjuntar "~Finalize un " luego el type's name to el routine's header string.
Adjuntar "Intel $50. " to el routine's body string. \ push eax
Adjuntar "Unassign el string's first. " to el routine's body string.
Adjuntar "Intel $58." to el routine's body string. \ pop eax
Colocar el routine's routine header on el routine's header string.
Colocar el routine's routine body on el routine's body string.
Compilar el header of el routine.
Para agregar un fragment usando un tag:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Para agregar un fragment usando un tag y un entry:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el entry into el fragment's entry.
Para agregar un fragment usando un tag y un flag:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el flag into el fragment's flag.
Para agregar un fragment usando un tag y un routine:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el routine into el fragment's routine.
Compilar el body of el routine.
Para agregar un fragment usando un tag y un variable:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el variable into el fragment's variable.
Definir el compiled flag in el variable.
Para agregar un fragment usando un tag y un variable and another variable:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el variable into el fragment's variable.
Poner el other variable into el fragment's other variable.
Definir el compiled flag in el variable.
Definir el compiled flag in el other variable.
Para agregar un fragment usando un tag y un variable y un número:
Si el current routine es nil,
Void el fragment;
Salir.
Crear el fragment usando el tag.
Adjuntar el fragment to el current routine's fragments.
Poner el variable into el fragment's variable.
Poner el número into el fragment's número.
Definir el compiled flag in el variable.
Para agregar un import to some imports usando un import name:
Crear el import.
Adjuntar el import to el imports.
Poner el import name into el import's name.
Para agregar un intermediate usando un type name y un locus:
Si el current routine es nil,
Void el intermediate;
Salir.
Agregar el intermediate to el current routine's locals usando "local" y el locus.
Generate el intermediate's name usando "~I".
Poner el type name into el intermediate's type name.
Resolve el intermediate.
Para agregar un literal to some variables usando un locus:
Agregar el literal as un variable to el variables usando "literal" y el locus.
Generate el literal's name usando "~L".
Para agregar un monikette to some monikettes usando un expression:
Crear el monikette.
Adjuntar el monikette to el monikettes.
Poner el expression's phrase into el monikette's string.
Poner el expression's variable into el monikette's variable.
Si el expression's variable es not nil, Poner el expression's type into el monikette's type.
Para agregar un monikette to some monikettes usando un string:
Crear el monikette.
Adjuntar el monikette to el monikettes.
\ Spanish conjunctions, etc
Si el string es "y",
Poner "and" into el monikette's string;
Salir. \ and
Si el string es "e",
Poner "and" into el monikette's string;
Salir. \ and
Si el string es "o",
Poner "or" into el monikette's string;
Salir. \ or
Si el string es "u",
Poner "or" into el monikette's string;
Salir. \ or
\ from/given/con/using
Si el string es "desde",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "de",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "dada",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "dado",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "con",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "usando",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "from",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "given",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "with",
Poner "from/given/con/using" into el monikette's string;
Salir.
Si el string es "using",
Poner "from/given/con/using" into el monikette's string;
Salir.
\ in/into/to
Si el string es "en",
Poner "in/into/to" into el monikette's string;
Salir.
Si el string es "in",
Poner "in/into/to" into el monikette's string;
Salir.
Si el string es "into",
Poner "in/into/to" into el monikette's string;
Salir.
Si el string es "to",
Poner "in/into/to" into el monikette's string;
Salir.
Si el string es "a",
Poner "in/into/to" into el monikette's string;
Salir.
\ is/are
Si el string es "are",
Poner "is/are" into el monikette's string;
Salir.
Si el string es "is",
Poner "is/are" into el monikette's string;
Salir.
Si el string es "es",
Poner "is/are" into el monikette's string;
Salir.
Si el string es "está",
Poner "is/are" into el monikette's string;
Salir.
Si el string es "se",
Poner "is/are" into el monikette's string;
Salir.
\ aren't/isn't
Si el string es "isn't",
Poner "is/aren't" into el monikette's string;
Salir.
Si el string es "aren't",
Poner "is/aren't" into el monikette's string;
Salir.
\ backward/backwards/counterclockwise/counter-clockwise/anticlockwise/anti-clockwise
Si el string es "backward",
Poner "backward" into el monikette's string;
Salir.
Si el string es "backwards",
Poner "backward" into el monikette's string;
Salir.
Si el string es "counterclockwise",
Poner "backward" into el monikette's string;
Salir.
Si el string es "counter-clockwise",
Poner "backward" into el monikette's string;
Salir.
Si el string es "anticlockwise",
Poner "backward" into el monikette's string;
Salir.
Si el string es "anti-clockwise",
Poner "backward" into el monikette's string;
Salir.
\ at/on
Si el string es "at",
Poner "at/on" into el monikette's string;
Salir.
Si el string es "on",
Poner "at/on" into el monikette's string;
Salir.
\ Spanish allocates and destroys
Si el string es "asignar",
Poner "allocate" into el monikette's string;
Salir.
Si el string es "memoria",
Poner "memory" into el monikette's string;
Salir.
Si el string es "para",
Poner "for" into el monikette's string;
Salir.
Si el string es "desasignar",
Poner "deallocate" into el monikette's string;
Salir.
Si el string es "destruir",
Poner "destroy" into el monikette's string;
Salir.
\ other
Poner el string into el monikette's string.
Para agregar un monikette to some monikettes usando un type:
Crear el monikette.
Adjuntar el monikette to el monikettes.
Poner el type into el monikette's type.
Para agregar push fragments usando some monikettes:
Si el current routine es nil, salir.
Lazo.
Obtener un monikette desde el monikettes (backwards).
Si el monikette es nil, salir.
Si el monikette's variable es nil, repetir.
Si el monikette's current substring es not blank, repetir.
Si el monikette's current type es nil, repetir.
Agregar un fragment usando el push address tag y el monikette's variable.
Repetir.
Para agregar el poner or convertir fragments usando un variable and another variable y un locus:
Agregar un fragment usando el push address tag y el other variable.
Agregar another fragment usando el push address tag y el variable.
Encontrar un routine usando "Poner" y el variable's type and "into" y el other variable's type.
Si el routine es nil,
Encontrar el routine usando "Convertir" y el variable's type and "to" y el other variable's type.
Si el routine es not nil,
Agregar un third fragment usando el call internal tag y el routine;
Salir.
\ error message
Agregar un monikette to some monikettes usando "Poner/Convertir".
Agregar another monikette to el monikettes usando el variable's type.
Agregar un third monikette to el monikettes usando "into/to".
Agregar un fourth monikette to el monikettes usando el other variable's type.
Convertir el monikettes to un moniker.
Destroy el monikettes.
Abortar con "No sé cómo '" luego el moniker luego "'." y el locus.
Para agregar un routine to some routines usando un locus:
Crear el routine.
Adjuntar el routine to el routines.
Poner el locus into el routine's locus.
Para agregar un scratch usando un type name y un locus:
Si el current routine es nil,
Void el scratch;
Salir.
Agregar el scratch to el current routine's locals usando "scratch" y el locus.
Generate el scratch's name usando "~S".
Poner el type name into el scratch's type name.
Resolve el scratch.
Para agregar fragmentos pertinentes usando un string y un variable and another string and another variable y un locus:
Agregar un fragment usando el push address tag y el other variable.
Agregar another fragment usando el push address tag y el variable.
Agregar un monikette to some monikettes usando el string.
Agregar another monikette to el monikettes usando el variable's type.
Agregar un third monikette to el monikettes usando el other string.
Agregar un fourth monikette to el monikettes usando el other variable's type.
Encontrar un routine usando el monikettes.
Si el routine es nil, convertir el monikettes to un moniker.
Destroy el monikettes.
Si el routine es nil,
Abortar con "No sé cómo '" luego el moniker luego "'." y el locus;
Salir.
Agregar un third fragment usando el call internal tag y el routine.
Para agregar fragmentos pertinentes usando un string y un variable and
another string and another variable and
un third string and un third variable and
un byte puntero: \ and another byte puntero lol
Agregar un fragment usando el push address tag y el third variable.
Agregar another fragment usando el push address tag y el other variable.
Agregar un third fragment usando el push address tag y el variable.
Agregar un monikette to some monikettes usando el string.
Agregar another monikette to el monikettes usando el variable's type.
Agregar un third monikette to el monikettes usando el other string.
Agregar un fourth monikette to el monikettes usando el other variable's type.
Agregar un fifth monikette to el monikettes usando el third string.
Agregar un sixth monikette to el monikettes usando el third variable's type.
Encontrar un routine usando el monikettes.
Si el routine es nil, convertir el monikettes to un moniker.
Destroy el monikettes.
Si el routine es nil,
Abortar con "No sé cómo '" luego el moniker luego "'." y el byte puntero;
Salir.
Agregar un fourth fragment usando el call internal tag y el routine.
Para agregar un source file to some source files usando un path:
Crear el source file.
Adjuntar el source file to el source files.
Poner el path into el source file's path.
Para agregar two fragments usando un string y un variable y un locus:
Agregar un fragment usando el push address tag y el variable.
Agregar un monikette to some monikettes usando el string.
Agregar another monikette to el monikettes usando el variable's type.
Encontrar un routine usando el monikettes.
Si el routine es nil, convertir el monikettes to un moniker.
Destroy el monikettes.
Si el routine es nil,
Abortar con "No sé cómo '" luego el moniker luego "'." y el locus;
Salir.
Agregar another fragment usando el call internal tag y el routine.
Para agregar un type to some types usando un locus:
Crear el type.
Adjuntar el type to el types.
Poner el locus into el type's locus.
Para agregar un type to some types usando un name y un plural name y un base name:
Agregar el type to el types usando el name y el plural name y el base name and nil.
Para agregar un type to some types usando un name y un plural name y un base name y un locus:
Crear el type.
Adjuntar el type to el types.
Poner el locus into el type's locus.
Poner el name into el type's name.
Poner el plural name into el type's plural name.
Poner el base name into el type's base name.
Para agregar un variable to some variables usando un kind y un locus:
Crear el variable usando el kind.
Adjuntar el variable to el variables.
Poner el locus into el variable's locus.
The adding built-in memory routines timer es un timer.
The adding built-in startup routine timer es un timer.
Para address some entries:
\Lazo.
Obtener un entry desde el entries.
Si el entry es nil, salir.
Address el entry.
Repetir.
Para address un entry:
Poner el current name address into el entry's name address.
Poner el entry's name's length plus 3 into un número.
Redondear el número up to el nearest multiple of 2.
Agregar el número to el current name address.
Poner el current thunk address into el entry's thunk address.
Poner el image base plus el current thunk address into el entry's address.
Agregar 4 to el current thunk address.
Para address un fragment usando un address:
Si el compiler's abortar flag es set, salir.
Si el fragment es nil, salir.
Poner el image base plus el address into el fragment's address.
Si el fragment's tag es el push address tag,
Agregar 7 to el address;
Salir.
Si el fragment's tag es el call internal tag,
Agregar 5 to el address;
Salir.
Si el fragment's tag es el load address tag,
Agregar 12 to el address;
Salir.
Si el fragment's tag es el increment tag,
Agregar 10 to el address;
Salir.
Si el fragment's tag es el dereference tag,
Agregar 14 to el address;
Salir.
Si el fragment's tag es el jump false tag,
Agregar 9 to el address;
Salir.
Si el fragment's tag es el not tag,
Agregar 3 to el address;
Salir.
Si el fragment's tag es el exit tag,
Agregar 5 to el address;
Salir.
Si el fragment's tag es el repeat tag,
Agregar 5 to el address;
Salir.
Si el fragment's tag es el break tag,
Agregar 5 to el address;
Salir.
Si el fragment's tag es el prolog tag,
Address el fragment usando el address (prolog);
Salir.
Si el fragment's tag es el epilog tag,
Address el fragment usando el address (epilog);
Salir.
Si el fragment's tag es el intel tag,
Agregar el fragment's code's length to el address;
Salir.
Si el fragment's tag es el push value tag,
Address el fragment usando el address (push value);
Salir.
Si el fragment's tag es el call external tag,
Agregar 6 to el address;
Salir.
Si el fragment's tag es el load eax tag,
Agregar 5 to el address;
Salir. \ was 8 when "load eax" took in variables; now "load eax" only does un immediate value
Si el fragment's tag es el save eax tag,
Address el fragment usando el address (save eax);
Salir.
Si el fragment's tag es el call indirect tag,
Agregar 8 to el address;
Salir.
Si el fragment's tag es el routine address tag,
Agregar 12 to el address;
Salir.
Para address un fragment usando un address (epilog):
Si el current routine's callback flag es set,
Agregar 3 to el address.
Agregar 6 to el address.
Para address un fragment usando un address (prolog):
Agregar 3 to el address.
Si el current routine's local size es not 0,
Agregar 10 to el address.
Si el current routine's callback flag es set,
Agregar 3 to el address.
Para address un fragment usando un address (push value):
Agregar 6 to el address.
Si el fragment's variable es nil,
Abortar con "Internal error - address un fragment usando un address (push value)";
Salir.
Si el fragment's variable's type es nil,
Abortar con "Internal error 2 - address un fragment usando un address (push value)";
Salir.
Poner el fragment's variable's type's length into un length.
Si el length es 4,
Agregar 2 to el address;
Salir.
Si el length es 2,
Agregar 3 to el address;
Salir.
Si el length es 1,
Agregar 4 to el address;
Salir.
Abortar con "Internal error 3 - address un fragment usando un address (push value)".
Para address un fragment usando un address (save eax):
Agregar 6 to el address.
Si el fragment's variable es nil,
Abortar con "Internal error - address un fragment usando un address (push value)";
Salir.
Si el fragment's variable's type es nil,
Abortar con "Internal error 2 - address un fragment usando un address (push value)";
Salir.
Poner el fragment's variable's type's length into un length.
Si el length es 4,
Agregar 2 to el address;
Salir.
Si el length es 2,
Agregar 3 to el address;
Salir.
Si el length es 1,
Agregar 2 to el address;
Salir.
Abortar con "Internal error 3 - address un fragment usando un address (push value)".
Para address some fragments usando un address:
\Lazo.
Si el compiler's abortar flag es set, salir.
Obtener un fragment desde el fragments.
Si el fragment es nil, salir.
Address el fragment usando el address.
Repetir.
Para address un import:
Poner el current name address into el import's name address.
Poner el current header address into el import's header address.
Poner el current name address into el import's import header's name memory address.
Poner el import's name's length plus 1 into un número.
Redondear el número up to el nearest multiple of 2.
Agregar el número to el current name address.
Agregar un import header's magnitude to el current header address.
Poner el current thunk address into el import's import header's first thunk memory address.
Address el import's entries.
Agregar 4 to el current thunk address.
Para address some imports usando un address:
Poner el address into el current header address.
Poner el imports' count into un count.
Agregar 1 to el count.
Multiplicar el count by un import header's magnitude.
Poner el address plus el count into el current thunk address.
Obtener another count usando el imports (all entries plus markers).
Multiplicar el other count by 4.
Poner el current thunk address plus el other count into el current name address.
Lazo.
Obtener un import desde el imports.
Si el import es nil, interrumpir.
Address el import.
Repetir.
Poner el current name address minus el address into un número.
Agregar el número to el address.
An address es un número.
Para address un routine usando un address:
Si el compiler's abortar flag es set, salir.
Si el routine es nil, salir.
Si el routine's employs moniker es not blank, salir. \ employs are addressed later
Si el routine's compiled flag es not set, salir.
Poner el routine into el current routine.
Poner el image base plus el address into el routine's address.
Address el routine's fragments usando el address.
Redondear el address up to el nearest multiple of 4.
Para address some routines usando un address:
Si el compiler's abortar flag es set, salir.
Obtener un routine desde el routines.
Si el routine es nil, interrumpir.
Address el routine usando el address.
Repetir.
Para address un variable usando un address:
Si el compiler's abortar flag es set, salir.
Si el variable es nil, salir.
Si el variable's compiled flag es not set, salir.
Poner el image base plus el address into el variable's address.
Agregar el variable's type's length to el address.
Si el variable's type can be reduced to "string",
Agregar el variable's data's length plus 1 to el address.
Redondear el address up to el nearest multiple of 4.
Para address some variables usando un address:
Si el compiler's abortar flag es set, salir.
Obtener un variable desde el variables.
Si el variable es nil, salir.
Address el variable usando el address.
Repetir.
The addressing timer es un timer.
Para advance un buffer:
Adjuntar el return byte to el buffer.
Adjuntar el linefeed byte to el buffer.
Para advance un buffer (twice):
Advance el buffer.
Advance el buffer.
Para adjuntar un entry to un buffer (con separator):
Si el entry es nil,
Adjuntar "" to el buffer (con separator);
Salir.
Adjuntar el entry's name to el buffer (con separator).
Para adjuntar un flag to un buffer (con separator):
Convertir el flag to un string.
Adjuntar el string to el buffer (con separator).
Para adjuntar el global finalizers to un string:
Obtener un global desde el globals.
Si el global es nil, salir.
Si el global's compiled flag es not set, repetir.
Si el global's type should not be finalized, repetir.
Adjuntar "~finalize el " luego el global's name luego ". " to el string.
Repetir.
Para adjuntar el global initializers to un string:
Obtener un global desde el globals.
Si el global es nil, salir.
Si el global's literal es nil, repetir.
Si el global's compiled flag es not set, repetir.
Borrar un flag.
Adjuntar el global's initializer string to el string.
Repetir.
Para adjuntar un monikette to un moniker:
Si el monikette es nil, salir.
Si el moniker es not blank,
Adjuntar el space byte to el moniker.
Si el monikette's type es not nil,
Adjuntar "[" y el monikette's type's name and "]" to el moniker (fast);
Salir.
Si el monikette's string es not blank,
Adjuntar el monikette's string to el moniker;
Salir.
Para adjuntar un monikette to un moniker (while bubbling):
Si el monikette es nil, salir.
Si el moniker es not blank,
Adjuntar el space byte to el moniker.
Si el monikette's current substring es not blank,
Adjuntar el monikette's current substring to el moniker;
Salir.
Si el monikette's current type es not nil,
Adjuntar "[" y el monikette's current type's name and "]" to el moniker (fast);
Salir.
Para adjuntar un número to un buffer (as hex con separator):
Convertir el número to un nibble string.
Adjuntar el nibble string to el buffer (con separator).
Para adjuntar un número to un buffer (con separator):
Convertir el número to un string.
Adjuntar el string to el buffer (con separator).
Para adjuntar un ratio to un buffer (con separator):
Convertir el ratio to un string.
Adjuntar el string to el buffer (con separator).
Para adjuntar un routine to un buffer (con separator):
Si el routine es nil,
Adjuntar "" to el buffer (con separator);
Salir.
Adjuntar el routine's moniker to el buffer (con separator).
Para adjuntar un string and another string y un third string to un fourth string (fast):
Poner el fourth string's length into un length.
Agregar el string's length to el length.
Agregar el other string's length to el length.
Agregar el third string's length to el length.
Reassign un puntero usando el length.
Poner el puntero into un byte puntero.
Copiar bytes desde el fourth string's first to el byte puntero for el fourth string's length.
Agregar el fourth string's length to el byte puntero.
Copiar bytes desde el string's first to el byte puntero for el string's length.
Agregar el string's length to el byte puntero.
Copiar bytes desde el other string's first to el byte puntero for el other string's length.
Agregar el other string's length to el byte puntero.
Copiar bytes desde el third string's first to el byte puntero for el third string's length.
Unassign el fourth string's first.
Poner el puntero into el fourth string's first.
Poner el puntero plus el length minus 1 into el fourth string's last.
Para adjuntar un string to un buffer (con separator):
Adjuntar el string to el buffer.
Adjuntar "/" to el buffer.
Para adjuntar un tag to un buffer (as un fragment tag string con separator):
Si el tag es el break tag,
Adjuntar "break" to el buffer (con separator);
Salir.
Si el tag es el call external tag,
Adjuntar "call external" to el buffer (con separator);
Salir.
Si el tag es el call indirect tag,
Adjuntar "call indirect" to el buffer (con separator);
Salir.
Si el tag es el call internal tag,
Adjuntar "call internal" to el buffer (con separator);
Salir.
Si el tag es el dereference tag,
Adjuntar "dereference" to el buffer (con separator);
Salir.
Si el tag es el end if tag,
Adjuntar "end if" to el buffer (con separator);
Salir.
Si el tag es el epilog tag,
Adjuntar "epilog" to el buffer (con separator);
Salir.
Si el tag es el exit tag,
Adjuntar "exit" to el buffer (con separator);
Salir.
Si el tag es el finalize tag,
Adjuntar "finalize" to el buffer (con separator);
Salir.
Si el tag es el increment tag,
Adjuntar "increment" to el buffer (con separator);
Salir.
Si el tag es el intel tag,
Adjuntar "intel" to el buffer (con separator);
Salir.
Si el tag es el jump false tag,
Adjuntar "jump false" to el buffer (con separator);
Salir.
Si el tag es el load address tag,
Adjuntar "load address" to el buffer (con separator);
Salir.
Si el tag es el load eax tag,
Adjuntar "load eax" to el buffer (con separator);
Salir.
Si el tag es el loop tag,
Adjuntar "loop" to el buffer (con separator);
Salir.
Si el tag es el not tag,
Adjuntar "not" to el buffer (con separator);
Salir.
Si el tag es el prolog tag,
Adjuntar "prolog" to el buffer (con separator);
Salir.
Si el tag es el push address tag,
Adjuntar "push address" to el buffer (con separator);
Salir.
Si el tag es el push value tag,
Adjuntar "push value" to el buffer (con separator);
Salir.
Si el tag es el save eax tag,
Adjuntar "save eax" to el buffer (con separator);
Salir.