Commit 73c43d6c4adb85d5f53bde2610194faada7687e8
1 parent
a832582f
*** empty log message ***
Showing
4 changed files
with
460 additions
and
94 deletions
Show diff stats
anubis_dev/compiler2/src/common.anubis
| ... | ... | @@ -38,7 +38,8 @@ |
| 38 | 38 | interpretations are computed. |
| 39 | 39 | |
| 40 | 40 | public type WeakExpr:... |
| 41 | - | |
| 41 | +public type StrongType:... | |
| 42 | +public type StrongTerm:... | |
| 42 | 43 | |
| 43 | 44 | |
| 44 | 45 | |
| ... | ... | @@ -57,6 +58,7 @@ public type WeakExpr:... |
| 57 | 58 | |
| 58 | 59 | |
| 59 | 60 | public type Position: |
| 61 | + predefined, | |
| 60 | 62 | position(String absolute_path, |
| 61 | 63 | Nat line_number, |
| 62 | 64 | Nat column_number). |
| ... | ... | @@ -203,8 +205,12 @@ public type WeakExpr: |
| 203 | 205 | local_def (Position position, |
| 204 | 206 | WeakExpr symbol, |
| 205 | 207 | WeakExpr value, |
| 206 | - WeakExpr body). | |
| 208 | + WeakExpr body), | |
| 209 | + | |
| 210 | + strong_type (StrongType), | |
| 211 | + strong_term (StrongTerm). | |
| 207 | 212 | |
| 213 | + The alternatives 'strong_type' and 'strong_term' are needed by predefinitions. | |
| 208 | 214 | |
| 209 | 215 | The list of valid signs may be found in the file 'lexer_1.anubis'. |
| 210 | 216 | ... | ... |
anubis_dev/compiler2/src/dictionary_1.anubis
| ... | ... | @@ -29,13 +29,22 @@ |
| 29 | 29 | Dictionaries are the places where the compiler stores its 'knowledge'. These |
| 30 | 30 | dictionaries are saved to files, so as to be used at the next compilation. When a |
| 31 | 31 | dictionary is retrieved at the next compilation, obsolete entries are discarded. This |
| 32 | - is decided according to dependancies between modules and dates of last modifications. | |
| 33 | - Hence, unchanged modules are not recompiled. | |
| 32 | + is decided according to dependancies between modules and dates of last modifications. | |
| 33 | + | |
| 34 | + Hence, unmodified modules are not recompiled. | |
| 34 | 35 | |
| 35 | 36 | |
| 36 | 37 | |
| 37 | 38 | ----------------------------------- Table of Contents --------------------------------- |
| 38 | 39 | |
| 40 | + *** (1) Creating dictionaries. | |
| 41 | + *** (2) Getting the size of a dictionary (number of non empty entries). | |
| 42 | + *** (3) Updating all non empty entries in a dictionary according to a method. | |
| 43 | + *** (4) Adding entries to a dictionary. | |
| 44 | + *** (5) Getting entries from a dictionary. | |
| 45 | + *** (6) Saving a dictionary. | |
| 46 | + *** (7) Renumberings. | |
| 47 | + *** (8) Retrieving a dictionary. | |
| 39 | 48 | |
| 40 | 49 | --------------------------------------------------------------------------------------- |
| 41 | 50 | |
| ... | ... | @@ -64,7 +73,8 @@ public define Dictionary1($Entry,$Key1) |
| 64 | 73 | ( |
| 65 | 74 | Int32 bits_of_hash, |
| 66 | 75 | String dictionary_name, |
| 67 | - $Entry -> $Key1 compute_key1 | |
| 76 | + $Entry -> $Key1 compute_key1, | |
| 77 | + $Entry empty_entry | |
| 68 | 78 | ). |
| 69 | 79 | |
| 70 | 80 | The integer 'bits_of_hash' is the number of bits used for hashing keys. A value between |
| ... | ... | @@ -80,13 +90,14 @@ public define Dictionary2($Entry,$Key1,$Key2) |
| 80 | 90 | Int32 bits_of_hash, |
| 81 | 91 | String dictionary_name, |
| 82 | 92 | $Entry -> $Key1 compute_key1, |
| 83 | - $Entry -> $Key2 compute_key2 | |
| 93 | + $Entry -> $Key2 compute_key2, | |
| 94 | + $Entry empty_entry | |
| 84 | 95 | ). |
| 85 | 96 | |
| 86 | 97 | |
| 87 | 98 | |
| 88 | 99 | |
| 89 | - *** (2) Getting the size of a dictionary (number of non empty entries): | |
| 100 | + *** (2) Getting the size of a dictionary (number of non empty entries). | |
| 90 | 101 | |
| 91 | 102 | Dictionaries are always filled up from slot 0. Free slots are above the most recently |
| 92 | 103 | filled up one. The next functions return the number of filled up (non empty) entries. |
| ... | ... | @@ -128,10 +139,11 @@ public define One |
| 128 | 139 | |
| 129 | 140 | |
| 130 | 141 | |
| 142 | + | |
| 131 | 143 | |
| 132 | 144 | *** (4) Adding entries to a dictionary. |
| 133 | 145 | |
| 134 | - One may add a new entry to a dictionary, using the following tools: | |
| 146 | + We can add a new entry to a dictionary, using the following tools: | |
| 135 | 147 | |
| 136 | 148 | public define One |
| 137 | 149 | add_entry |
| ... | ... | @@ -154,18 +166,18 @@ public define One |
| 154 | 166 | |
| 155 | 167 | *** (5) Getting entries from a dictionary. |
| 156 | 168 | |
| 157 | - Entries may be got by id or by key. If an entry is got by id, it is unique or does'nt | |
| 158 | - exist, hence a result of type 'Maybe($Entry)'. If it is got by key, the number of | |
| 159 | - entries is arbitrary (including 0), hence a result of type 'List($Entry)'. | |
| 169 | + Entries may be got by id or by key. If an entry is got by id, it is unique (and must | |
| 170 | + exist), hence a result of type '$Entry'. If it is got by key, the number of entries is | |
| 171 | + arbitrary (including 0), hence a result of type 'List($Entry)'. | |
| 160 | 172 | |
| 161 | -public define Maybe($Entry) | |
| 173 | +public define $Entry | |
| 162 | 174 | get_entry |
| 163 | 175 | ( |
| 164 | 176 | Dictionary1($Entry,$Key1) dictionary, |
| 165 | 177 | Int32 id |
| 166 | 178 | ). |
| 167 | 179 | |
| 168 | -public define Maybe($Entry) | |
| 180 | +public define $Entry | |
| 169 | 181 | get_entry |
| 170 | 182 | ( |
| 171 | 183 | Dictionary2($Entry,$Key1,$Key2) dictionary, |
| ... | ... | @@ -199,8 +211,8 @@ public define List($Entry) |
| 199 | 211 | *** (6) Saving a dictionary. |
| 200 | 212 | |
| 201 | 213 | The dictionary is saved in the current directory in the sens of the host system, |
| 202 | - i.e. in the directory from where the compiler has been started. The name of the file is | |
| 203 | - the name of the dictionary, with the extension ".dictionary" appended. | |
| 214 | + i.e. in the directory the compiler has been started from. The name of the file is the | |
| 215 | + name of the dictionary, with the extension ".dictionary" appended. | |
| 204 | 216 | |
| 205 | 217 | public define One |
| 206 | 218 | save |
| ... | ... | @@ -223,9 +235,9 @@ public define One |
| 223 | 235 | |
| 224 | 236 | When a dictionary is retrieved at the beginning of a new compilation, source modules |
| 225 | 237 | may have changed since the last compilation. Hence, some entries in the dictionary may |
| 226 | - be obsolete. For this reason, we must provide a function for dicarding or updating an | |
| 227 | - entry. This has the effect of renumbering the entries. The correspondance between old | |
| 228 | - ids and new ids is given by a datum of type 'Renumbering($Entry)'. | |
| 238 | + be obsolete. For this reason, we must provide a function for dicarding obsolete | |
| 239 | + entries. This has the effect of renumbering the entries. The correspondance between | |
| 240 | + old ids and new ids is given by a datum of type 'Renumbering($Entry)'. | |
| 229 | 241 | |
| 230 | 242 | public type Renumbering($Entry):... |
| 231 | 243 | |
| ... | ... | @@ -239,7 +251,8 @@ public define Renumbering($Entry) |
| 239 | 251 | Int32 number_of_entries |
| 240 | 252 | ). |
| 241 | 253 | |
| 242 | - The next tool gives the size (number of old ids) in a renumbering. | |
| 254 | + The next tool gives the size (number of old ids, including those which have no | |
| 255 | + corresponding new id) in a renumbering. | |
| 243 | 256 | |
| 244 | 257 | public define Int32 |
| 245 | 258 | size |
| ... | ... | @@ -250,17 +263,17 @@ public define Int32 |
| 250 | 263 | |
| 251 | 264 | |
| 252 | 265 | For getting a new id knowing the old id, we use one of the following, depending on the |
| 253 | - fact that we knwo that the new id exists or not. | |
| 266 | + fact that we know that the new id exists or not. | |
| 254 | 267 | |
| 255 | 268 | public define Int32 |
| 256 | - new_id | |
| 269 | + new_id // if we know that the new id exists | |
| 257 | 270 | ( |
| 258 | 271 | Renumbering($Entry) renumbering, |
| 259 | 272 | Int32 old_id |
| 260 | 273 | ). |
| 261 | 274 | |
| 262 | 275 | public define Maybe(Int32) |
| 263 | - maybe_new_id | |
| 276 | + maybe_new_id // if we don't know if the new id exists | |
| 264 | 277 | ( |
| 265 | 278 | Renumbering($Entry) renumbering, |
| 266 | 279 | Int32 old_id |
| ... | ... | @@ -286,7 +299,8 @@ public define Maybe((Dictionary1($Entry,$Key),Renumbering($Entry))) |
| 286 | 299 | Int32 bits_of_hash, |
| 287 | 300 | String name, |
| 288 | 301 | $Entry -> $Key compute_key, |
| 289 | - $Entry -> KeepOrDiscard discard | |
| 302 | + $Entry -> KeepOrDiscard discard, | |
| 303 | + $Entry empty_entry | |
| 290 | 304 | ). |
| 291 | 305 | |
| 292 | 306 | public define Maybe((Dictionary2($Entry,$Key1,$Key2),Renumbering($Entry))) |
| ... | ... | @@ -296,12 +310,13 @@ public define Maybe((Dictionary2($Entry,$Key1,$Key2),Renumbering($Entry))) |
| 296 | 310 | String name, |
| 297 | 311 | $Entry -> $Key1 compute_key1, |
| 298 | 312 | $Entry -> $Key2 compute_key2, |
| 299 | - $Entry -> KeepOrDiscard discard | |
| 313 | + $Entry -> KeepOrDiscard discard, | |
| 314 | + $Entry empty_entry | |
| 300 | 315 | ). |
| 301 | 316 | |
| 302 | 317 | A result of 'failure' means that some problem has been encountered, and that the |
| 303 | 318 | dictionary must be regenerated. Otherwise, we get the retrieved dictionary together |
| 304 | - with the correponding 'Renumbering($Entry)'. | |
| 319 | + with the correponding 'Renumbering'. | |
| 305 | 320 | |
| 306 | 321 | Dictionaries usually depend on each other. For example, an entry in the dictionary of |
| 307 | 322 | types contains references by id to entries in the dictionary of modules. When all |
| ... | ... | @@ -321,6 +336,24 @@ read tools/basis.anubis |
| 321 | 336 | |
| 322 | 337 | ----------------------------------- Table of Contents --------------------------------- |
| 323 | 338 | |
| 339 | + *** [1] Dictionaries. | |
| 340 | + *** [2] Creating a dictionary. | |
| 341 | + *** [3] Updating all entries in a dictionary. | |
| 342 | + *** [4] Adding an entry to the dictionary. | |
| 343 | + *** [5] Getting an entry from a dictionary. | |
| 344 | + *** [5.1] Getting an entry by id. | |
| 345 | + *** [5.2] Getting the list of ids associated to a key. | |
| 346 | + *** [5.3] Getting an entry by key. | |
| 347 | + *** [6] Saving a dictionary. | |
| 348 | + *** [6.1] Writing bytes. | |
| 349 | + *** [6.2] Saving all entries. | |
| 350 | + *** [6.3] Saving the whole dictionary. | |
| 351 | + *** [7] Retrieving a dictionary. | |
| 352 | + *** [7.1] Renumberings. | |
| 353 | + *** [7.2] Reading a given number of bytes. | |
| 354 | + *** [7.3] Retrieving a single entry. | |
| 355 | + *** [7.4] Retrieving a whole dictionary. | |
| 356 | + *** [7.5] The two interfaces. | |
| 324 | 357 | |
| 325 | 358 | --------------------------------------------------------------------------------------- |
| 326 | 359 | |
| ... | ... | @@ -341,17 +374,18 @@ public type Dictionary1($Entry,$Key1): |
| 341 | 374 | |
| 342 | 375 | The reason why 'main_table' has a double level of 'Var' is that we must first be able |
| 343 | 376 | to add an entry (this is enabled by the 'MVar'), and also to change the whole table |
| 344 | - when it needs to be enlarged (this is enabled by the 'Var'). Of course, since an entry | |
| 345 | - may be 'empty', we use 'Maybe($Entry)' instead of '$Entry'. | |
| 346 | - | |
| 347 | - 'next' is the position of the next free (empty) slot in the table. The main table is | |
| 348 | - always filled up from the bottom, and an entry is never discarded. | |
| 377 | + when it needs to be enlarged (this is enabled by the 'Var'). '*next' is the position | |
| 378 | + of the next free (empty) slot in the table. The main table is always filled up from the | |
| 379 | + bottom, and an entry is never discarded. All slots starting at index '*next' are | |
| 380 | + 'empty'. Actually they are filled up with a default 'empty entry'. | |
| 349 | 381 | |
| 350 | 382 | 'index1' is a 'hashtable'. The size of the table is '2^b' where 'b' is the given number |
| 351 | 383 | of bits of hash. In each slot, we have a (usually small) association list, giving the |
| 352 | 384 | correspondance between a key and the list of corresponding ids. |
| 353 | 385 | |
| 354 | 386 | |
| 387 | + The same one with 2 keys: | |
| 388 | + | |
| 355 | 389 | public type Dictionary2($Entry,$Key1,$Key2): |
| 356 | 390 | dict |
| 357 | 391 | ( |
| ... | ... | @@ -438,23 +472,25 @@ public define Int32 |
| 438 | 472 | |
| 439 | 473 | |
| 440 | 474 | |
| 441 | - *** [] Updating all entries in a dictionary. | |
| 475 | + *** [3] Updating all entries in a dictionary. | |
| 442 | 476 | |
| 443 | 477 | define One |
| 444 | 478 | update_all_entries // auxiliary function |
| 445 | 479 | ( |
| 446 | 480 | MVar(Maybe($Entry)) table, |
| 447 | 481 | $Entry -> $Entry method, |
| 448 | - Int32 i // increasing index | |
| 482 | + Int32 i, // increasing index | |
| 483 | + Int32 next // number of non empty entries | |
| 449 | 484 | ) = |
| 450 | - if i >= length(table) then unique else // end of the table | |
| 485 | + if i >= next then unique else | |
| 451 | 486 | if *table(i) is |
| 452 | 487 | { |
| 453 | - failure then unique, // end of the table | |
| 488 | + failure then unique, | |
| 454 | 489 | success(entry) then |
| 455 | 490 | table(i) <- success(method(entry)); |
| 456 | - update_all_entries(table,method,i+1) | |
| 491 | + update_all_entries(table,method,i+1,next) | |
| 457 | 492 | }. |
| 493 | + | |
| 458 | 494 | |
| 459 | 495 | public define One |
| 460 | 496 | update_all_entries |
| ... | ... | @@ -463,8 +499,9 @@ public define One |
| 463 | 499 | $Entry -> $Entry method |
| 464 | 500 | ) = |
| 465 | 501 | if dictionary is dict(name,main_tab,next,idx,ckey,hkey) then |
| 466 | - update_all_entries(*main_tab,method,0). | |
| 502 | + update_all_entries(*main_tab,method,0,*next). | |
| 467 | 503 | |
| 504 | + | |
| 468 | 505 | public define One |
| 469 | 506 | update_all_entries |
| 470 | 507 | ( |
| ... | ... | @@ -476,7 +513,7 @@ public define One |
| 476 | 513 | |
| 477 | 514 | |
| 478 | 515 | |
| 479 | - *** [3] Adding an entry to the dictionary. | |
| 516 | + *** [4] Adding an entry to the dictionary. | |
| 480 | 517 | |
| 481 | 518 | First we have auxiliary functions for updating the index. The first one adds an index |
| 482 | 519 | entry into a A-list with the index. |
| ... | ... | @@ -557,13 +594,47 @@ public define One |
| 557 | 594 | |
| 558 | 595 | |
| 559 | 596 | |
| 560 | - *** [4] Getting an entry from a dictionary. | |
| 597 | + *** [5] Getting an entry from a dictionary. | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + *** [5.1] Getting an entry by id. | |
| 603 | + | |
| 604 | +public define $Entry | |
| 605 | + get_entry | |
| 606 | + ( | |
| 607 | + Dictionary1($Entry,$Key1) dictionary, | |
| 608 | + Int32 id | |
| 609 | + ) = | |
| 610 | + if dictionary is dict(name,main_tab,next,idx,ckey,hkey) then | |
| 611 | + if *(*main_tab)(id) is | |
| 612 | + { | |
| 613 | + failure then alert, | |
| 614 | + success(entry) then entry | |
| 615 | + }. | |
| 616 | + | |
| 617 | + | |
| 618 | +public define $Entry | |
| 619 | + get_entry | |
| 620 | + ( | |
| 621 | + Dictionary2($Entry,$Key1,$Key2) dictionary, | |
| 622 | + Int32 id | |
| 623 | + ) = | |
| 624 | + if dictionary is dict(name,main_tab,next,idx1,idx2,ckey1,ckey2,hkey1,hkey2) then | |
| 625 | + if *(*main_tab)(id) is | |
| 626 | + { | |
| 627 | + failure then alert, | |
| 628 | + success(entry) then entry | |
| 629 | + }. | |
| 630 | + | |
| 631 | + | |
| 561 | 632 | |
| 562 | 633 | |
| 563 | - *** [4.1] Tools. | |
| 634 | + *** [5.2] Getting the list of ids associated to a key. | |
| 564 | 635 | |
| 565 | - This tool ('get_ids_from_index') retrieves the list of ids associated with a key, using | |
| 566 | - an index. | |
| 636 | + The tool 'get_ids_from_index' retrieves the list of ids associated with a key, using an | |
| 637 | + index. | |
| 567 | 638 | |
| 568 | 639 | define List($U) |
| 569 | 640 | assoc |
| ... | ... | @@ -592,31 +663,7 @@ define List(Int32) |
| 592 | 663 | |
| 593 | 664 | |
| 594 | 665 | |
| 595 | - | |
| 596 | - *** [4.2] Getting an entry by id. | |
| 597 | - | |
| 598 | -public define Maybe($Entry) | |
| 599 | - get_entry | |
| 600 | - ( | |
| 601 | - Dictionary1($Entry,$Key1) dictionary, | |
| 602 | - Int32 id | |
| 603 | - ) = | |
| 604 | - if dictionary is dict(name,main_tab,next,idx,ckey,hkey) then | |
| 605 | - *(*main_tab)(id). | |
| 606 | - | |
| 607 | - | |
| 608 | -public define Maybe($Entry) | |
| 609 | - get_entry | |
| 610 | - ( | |
| 611 | - Dictionary2($Entry,$Key1,$Key2) dictionary, | |
| 612 | - Int32 id | |
| 613 | - ) = | |
| 614 | - if dictionary is dict(name,main_tab,next,idx1,idx2,ckey1,ckey2,hkey1,hkey2) then | |
| 615 | - *(*main_tab)(id). | |
| 616 | - | |
| 617 | - | |
| 618 | - | |
| 619 | - *** [4.3] Getting an entry by key. | |
| 666 | + *** [5.3] Getting an entry by key. | |
| 620 | 667 | |
| 621 | 668 | 'map_select' is defined in 'tools/basis.anubis'. |
| 622 | 669 | |
| ... | ... | @@ -660,7 +707,7 @@ public define List($Entry) |
| 660 | 707 | |
| 661 | 708 | |
| 662 | 709 | |
| 663 | - *** [5] Saving a dictionary. | |
| 710 | + *** [6] Saving a dictionary. | |
| 664 | 711 | |
| 665 | 712 | Dictionaries are saved as follows into the file 'name.dictionary', where 'name' is the |
| 666 | 713 | name of the dictionary: |
| ... | ... | @@ -673,10 +720,12 @@ public define List($Entry) |
| 673 | 720 | |
| 674 | 721 | |
| 675 | 722 | |
| 676 | - *** [5.1] Writing bytes. | |
| 723 | + *** [6.1] Writing bytes. | |
| 677 | 724 | |
| 678 | 725 | The tool below writes all bytes of the given 'ByteArray' into the given file (recall |
| 679 | - that 'write' may not write all bytes; see predefined.anubis). | |
| 726 | + that 'write' may not write all bytes; see predefined.anubis). If some problem arises, | |
| 727 | + there is just nothing to do, because the file will be inconsistant and at the next | |
| 728 | + compilation the dictionary will be regenerated. | |
| 680 | 729 | |
| 681 | 730 | define One |
| 682 | 731 | write_all_bytes |
| ... | ... | @@ -695,7 +744,7 @@ define One |
| 695 | 744 | |
| 696 | 745 | |
| 697 | 746 | |
| 698 | - *** [5.2] Saving all entries. | |
| 747 | + *** [6.2] Saving all entries. | |
| 699 | 748 | |
| 700 | 749 | The next function saves all entries (the number of entries is already saved). |
| 701 | 750 | |
| ... | ... | @@ -719,7 +768,7 @@ define One |
| 719 | 768 | |
| 720 | 769 | |
| 721 | 770 | |
| 722 | - *** [5.3] Saving the whole dictionary. | |
| 771 | + *** [6.3] Saving the whole dictionary. | |
| 723 | 772 | |
| 724 | 773 | The next function saves the whole dictionary. |
| 725 | 774 | |
| ... | ... | @@ -764,25 +813,27 @@ public define One |
| 764 | 813 | |
| 765 | 814 | |
| 766 | 815 | |
| 767 | - *** [6] Retrieving a dictionary. | |
| 816 | + *** [7] Retrieving a dictionary. | |
| 768 | 817 | |
| 769 | 818 | |
| 770 | - *** [6.1] Renumberings. | |
| 819 | + *** [7.1] Renumberings. | |
| 771 | 820 | |
| 772 | 821 | public type Renumbering($Entry): |
| 773 | 822 | renum(MVar(Int32)). |
| 774 | 823 | |
| 775 | 824 | As one may see, the parameter $Entry is not used. However, it enhances the safety, |
| 776 | - because it becomes it links the renumbering to a specific type. Since all dictionaries | |
| 777 | - have distinct types, it becomes impossible to use one renumbering instead of another | |
| 778 | - one. | |
| 825 | + because it links the renumbering to a specific type. Since all dictionaries have | |
| 826 | + distinct types, it becomes impossible to use one renumbering instead of another one. | |
| 779 | 827 | |
| 780 | 828 | By convention, within a 'Renumbering', 0 represents an invalid id, and each valid id, |
| 781 | - say 'n' is represented as 'n+1'. | |
| 829 | + say 'n' is represented as 'n+1'. It would have been cleaner to use 'Maybe(Int32)' | |
| 830 | + instead of 'Int32', not using this trick. However, the trick is encapsulated into this | |
| 831 | + section, and needs not be known from the outside. Using 'Int32' is better for | |
| 832 | + performances, because 'Maybe(Int32)' is implemented as a 'mixed' type. | |
| 782 | 833 | |
| 783 | 834 | |
| 784 | 835 | public define Int32 |
| 785 | - new_id | |
| 836 | + new_id // when we are sure the new id exists | |
| 786 | 837 | ( |
| 787 | 838 | Renumbering($Entry) renumbering, |
| 788 | 839 | Int32 old_id |
| ... | ... | @@ -796,7 +847,7 @@ public define Int32 |
| 796 | 847 | else val - 1. |
| 797 | 848 | |
| 798 | 849 | public define Maybe(Int32) |
| 799 | - maybe_new_id | |
| 850 | + maybe_new_id // when we are not sure the new id exists | |
| 800 | 851 | ( |
| 801 | 852 | Renumbering($Entry) renumbering, |
| 802 | 853 | Int32 old_id |
| ... | ... | @@ -844,7 +895,7 @@ public define Int32 |
| 844 | 895 | |
| 845 | 896 | |
| 846 | 897 | |
| 847 | - *** [6.2] Reading a given number of bytes. | |
| 898 | + *** [7.2] Reading a given number of bytes. | |
| 848 | 899 | |
| 849 | 900 | Reading exactly 'n' bytes from a file (this may fail of course). |
| 850 | 901 | |
| ... | ... | @@ -877,7 +928,7 @@ define Maybe(ByteArray) |
| 877 | 928 | |
| 878 | 929 | |
| 879 | 930 | |
| 880 | - *** [6.3] Retrieving a single entry. | |
| 931 | + *** [7.3] Retrieving a single entry. | |
| 881 | 932 | |
| 882 | 933 | For retrieving an entry we must: |
| 883 | 934 | |
| ... | ... | @@ -921,7 +972,7 @@ define Maybe($Entry) |
| 921 | 972 | |
| 922 | 973 | |
| 923 | 974 | |
| 924 | - *** [6.4] Retrieving a whole dictionary. | |
| 975 | + *** [7.4] Retrieving a whole dictionary. | |
| 925 | 976 | |
| 926 | 977 | When calling this auxiliary function, the number of entries has already been read, and |
| 927 | 978 | the dictionary is already created and empty (partially filled up for recursive calls). |
| ... | ... | @@ -974,15 +1025,15 @@ define Maybe(($Dict,Renumbering($Entry))) |
| 974 | 1025 | |
| 975 | 1026 | |
| 976 | 1027 | |
| 977 | - The two interfaces: | |
| 1028 | + *** [7.5] The two interfaces. | |
| 978 | 1029 | |
| 979 | -define Maybe((Dictionary1($Entry,$Key),Renumbering($Entry))) | |
| 980 | - retrieve_dict | |
| 1030 | +public define Maybe((Dictionary1($Entry,$Key),Renumbering($Entry))) | |
| 1031 | + retrieve_dictionary | |
| 981 | 1032 | ( |
| 982 | 1033 | Int32 bits_of_hash, |
| 983 | 1034 | String name, |
| 984 | 1035 | $Entry -> $Key compute_key, |
| 985 | - $Entry -> KeepOrDiscard discard | |
| 1036 | + $Entry -> KeepOrDiscard discard | |
| 986 | 1037 | ) = |
| 987 | 1038 | with file_name = name+".dictionary", |
| 988 | 1039 | if file(file_name,read) is |
| ... | ... | @@ -1009,14 +1060,14 @@ define Maybe((Dictionary1($Entry,$Key),Renumbering($Entry))) |
| 1009 | 1060 | }. |
| 1010 | 1061 | |
| 1011 | 1062 | |
| 1012 | -define Maybe((Dictionary2($Entry,$Key1,$Key2),Renumbering($Entry))) | |
| 1013 | - retrieve_dict | |
| 1063 | +public define Maybe((Dictionary2($Entry,$Key1,$Key2),Renumbering($Entry))) | |
| 1064 | + retrieve_dictionary | |
| 1014 | 1065 | ( |
| 1015 | 1066 | Int32 bits_of_hash, |
| 1016 | 1067 | String name, |
| 1017 | 1068 | $Entry -> $Key1 compute_key1, |
| 1018 | 1069 | $Entry -> $Key2 compute_key2, |
| 1019 | - $Entry -> KeepOrDiscard discard | |
| 1070 | + $Entry -> KeepOrDiscard discard | |
| 1020 | 1071 | ) = |
| 1021 | 1072 | with file_name = name+".dictionary", |
| 1022 | 1073 | if file(file_name,read) is |
| ... | ... | @@ -1035,7 +1086,8 @@ define Maybe((Dictionary2($Entry,$Key1,$Key2),Renumbering($Entry))) |
| 1035 | 1086 | 0, // initial old_id |
| 1036 | 1087 | 0, // initial new_id |
| 1037 | 1088 | discard, |
| 1038 | - create_dictionary(bits_of_hash,name,compute_key1,compute_key2), | |
| 1089 | + create_dictionary(bits_of_hash,name, | |
| 1090 | + compute_key1,compute_key2), | |
| 1039 | 1091 | add_entry, |
| 1040 | 1092 | create_renumbering(number_of_entries)) |
| 1041 | 1093 | } | ... | ... |
anubis_dev/compiler2/src/memory_1.anubis
| ... | ... | @@ -27,6 +27,7 @@ read tools/basis.anubis |
| 27 | 27 | read tools/streams.anubis |
| 28 | 28 | read common.anubis |
| 29 | 29 | read dictionary_1.anubis |
| 30 | +read src_files_1.anubis | |
| 30 | 31 | |
| 31 | 32 | |
| 32 | 33 | ----------------------------------- Table of Contents --------------------------------- |
| ... | ... | @@ -151,7 +152,8 @@ public type State: |
| 151 | 152 | ( |
| 152 | 153 | List(Option) options, |
| 153 | 154 | Dictionaries dictionaries, |
| 154 | - Var(List(OpenModule)) read_stack | |
| 155 | + Var(List(OpenModule)) read_stack, | |
| 156 | + List(List(String)) read_paths | |
| 155 | 157 | ). |
| 156 | 158 | |
| 157 | 159 | |
| ... | ... | @@ -522,7 +524,7 @@ public define One |
| 522 | 524 | ( |
| 523 | 525 | State state |
| 524 | 526 | ) = |
| 525 | - if state is cstate(options,dictionaries,read_stack) then | |
| 527 | + if state is cstate(options,dictionaries,read_stack,read_paths) then | |
| 526 | 528 | save(dictionaries). |
| 527 | 529 | |
| 528 | 530 | |
| ... | ... | @@ -557,6 +559,16 @@ define List(Int32) |
| 557 | 559 | |
| 558 | 560 | Create an 'empty' state: |
| 559 | 561 | |
| 562 | +define List(List(String)) | |
| 563 | + get_read_paths | |
| 564 | + = | |
| 565 | + [ | |
| 566 | + split_path(get_current_directory), | |
| 567 | + split_path(my_anubis_directory), | |
| 568 | + split_path(anubis_directory) | |
| 569 | + ]. | |
| 570 | + | |
| 571 | + | |
| 560 | 572 | define State |
| 561 | 573 | new_state |
| 562 | 574 | ( |
| ... | ... | @@ -570,7 +582,9 @@ define State |
| 570 | 582 | create_dictionary(12, dat_dict_name,name), |
| 571 | 583 | create_dictionary(12, thm_dict_name,pattern) |
| 572 | 584 | ), |
| 573 | - var([])). | |
| 585 | + var([]), | |
| 586 | + get_read_paths | |
| 587 | + ). | |
| 574 | 588 | |
| 575 | 589 | |
| 576 | 590 | |
| ... | ... | @@ -837,7 +851,8 @@ public define State |
| 837 | 851 | update_thm_dictionary(thm_dict,mod_renum,typ_renum,dat_renum); |
| 838 | 852 | cstate(options, |
| 839 | 853 | dictionaries(mod_dict,typ_dict,dat_dict,thm_dict), |
| 840 | - var([])) | |
| 854 | + var([]), | |
| 855 | + get_read_paths) | |
| 841 | 856 | }. |
| 842 | 857 | |
| 843 | 858 | ... | ... |
| 1 | + | |
| 2 | + | |
| 3 | + _____ ___. .__ ________ | |
| 4 | + / _ \ ____ __ _\_ |__ |__| ______ \_____ \ | |
| 5 | + / /_\ \ / \| | \ __ \| |/ ___/ / ____/ | |
| 6 | + / | \ | \ | / \_\ \ |\___ \ / \ | |
| 7 | + \____|__ /___| /____/|___ /__/____ > \_______ \ | |
| 8 | + \/ The \/ Anubis \/ 2 \/ Project \/ | |
| 9 | + | |
| 10 | + | |
| 11 | + Name of this file: shift_replace_2.anubis | |
| 12 | + | |
| 13 | + Purpose of this file: Tools for shifting strong items and replacing de Bruijn | |
| 14 | + symbols in strong items. | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + Authors (Name [initials]): Alain Proute' [AP] | |
| 19 | + | |
| 20 | + Updates ([initials] (date) comment): | |
| 21 | + [AP] (2007 jul 04) Creation of this file. | |
| 22 | + | |
| 23 | + --------------------------------------------------------------------------------------- | |
| 24 | + | |
| 25 | +read common.anubis | |
| 26 | + | |
| 27 | + | |
| 28 | + There two fundamental operations we must be able to perform on strong items (strong | |
| 29 | + terms and strong types). They are named 'shifting' and 'replacing'. | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + *** (1) Shifting. | |
| 34 | + | |
| 35 | + A strong item contains occurrences of 'de Bruijn symbols'. These symbols represent | |
| 36 | + depths into the stack of the virtual machine. It is sometimes necessary to 'shift' a | |
| 37 | + strong item by a certain number, say 'n'. The result is meaningful relative to any | |
| 38 | + extention of the original stack obtained by pushing 'n' data on top of the | |
| 39 | + stack. Notice that the stack is heterogeneous, which means that the slots in the stack | |
| 40 | + do not have the same size. Their size depends only of the type of the content of the | |
| 41 | + slot. | |
| 42 | + | |
| 43 | + For example, if 'E' is statement (strong term of type 'Omega'), meaningful relative to | |
| 44 | + some strong context 'G' (representing the stack), the result of shifting 'E' by '1' is | |
| 45 | + meaningful relative to any strong context of the form '[T . G]', where 'T' is any type. | |
| 46 | + | |
| 47 | +public define StrongType shift(Int32 n, StrongType t). | |
| 48 | +public define StrongTerm shift(Int32 n, StrongTerm t). | |
| 49 | + | |
| 50 | + Actually, the operation of shifting by 'n' just amounts to add 'n' to all depths | |
| 51 | + encountered in the strong item. | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + *** (2) Replacing. | |
| 57 | + | |
| 58 | + Given a strong item 'E', we may need to replace all occurences of a given de Bruijn | |
| 59 | + symbol by a given strong term. The result of replacing all occurrences of the de Bruijn | |
| 60 | + symbol 'x' by the strong term 'a' in a strong item 'E' is generally denoted 'E[a/x]' by | |
| 61 | + logicians (read: 'E' within which 'a' replaces 'x'). The strong item 'E[a/x]' is | |
| 62 | + represented in this compiler by 'replace(E,a,x)'. | |
| 63 | + | |
| 64 | +public define StrongType replace(StrongType t, StrongTerm a, Int32 i). | |
| 65 | +public define StrongTerm replace(StrongTerm t, StrongTerm a, Int32 i). | |
| 66 | + | |
| 67 | + Notice hat 'E[a/x]' is meaningful relative to the same strong context as 'E'. | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + --- That's all for the public part ! -------------------------------------------------- | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + Shifting a strong type. | |
| 76 | + | |
| 77 | +public define StrongType | |
| 78 | + shift | |
| 79 | + ( | |
| 80 | + Int32 n, | |
| 81 | + StrongType t | |
| 82 | + ) = | |
| 83 | + if t is | |
| 84 | + { | |
| 85 | + _Parameter(String name) then | |
| 86 | + t, | |
| 87 | + | |
| 88 | + _Defined(Int32 type_id,List(StrongType) operands) then | |
| 89 | + _Defined(type_id, | |
| 90 | + map((StrongType st) |-> shift(n,st), | |
| 91 | + operands)), | |
| 92 | + | |
| 93 | + _Product(List(StrongType) l) then | |
| 94 | + _Product(map((StrongType st) |-> shift(n,st), | |
| 95 | + l)), | |
| 96 | + | |
| 97 | + _Functional(StrongType source,StrongType target) then | |
| 98 | + _Functional(shift(n,source),shift(n,target)), | |
| 99 | + | |
| 100 | + _Omega then | |
| 101 | + _Omega, | |
| 102 | + | |
| 103 | + _Witness(StrongTerm statement) then | |
| 104 | + _Witness(shift(n,statement)), | |
| 105 | + | |
| 106 | + _Quantified(String parameter,StrongType _T) then | |
| 107 | + _Quantified(parameter,shift(n,_T)) | |
| 108 | + }. | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + Shifting a strong term. 'n' is added to a depth at the unique place where depths are | |
| 113 | + found, i.e. in the alternative 'symbol'. Furthermore, shifting the declarative terms | |
| 114 | + 'lambda(...)' and 'forall(...)' requires a replacement because the symbol 'symbol(0)' | |
| 115 | + must not be shifted (the replacement 'undoes' the shifting for this symbol). | |
| 116 | + | |
| 117 | +public define StrongTerm | |
| 118 | + shift | |
| 119 | + ( | |
| 120 | + Int32 n, | |
| 121 | + StrongTerm t | |
| 122 | + ) = | |
| 123 | + if t is | |
| 124 | + { | |
| 125 | + global(Int32 id) then | |
| 126 | + global(id), | |
| 127 | + | |
| 128 | + symbol(Int32 depth) then | |
| 129 | + symbol(depth + n), | |
| 130 | + | |
| 131 | + tuple(List(StrongTerm) l) then | |
| 132 | + tuple(map((StrongTerm st) |-> shift(n,st),l)), | |
| 133 | + | |
| 134 | + proj(Int32 i,StrongTerm st) then | |
| 135 | + proj(i,shift(n,st)), | |
| 136 | + | |
| 137 | + incl(StrongType _T,Int32 i,StrongTerm st) then | |
| 138 | + incl(shift(n,_T),i,shift(n,st)), | |
| 139 | + | |
| 140 | + cond(StrongType _T,StrongTerm test,List(StrongTerm) cases) then | |
| 141 | + cond(shift(n,_T),shift(n,test), | |
| 142 | + map((StrongTerm st) |-> shift(n,st),cases)), | |
| 143 | + | |
| 144 | + lambda(StrongType _T,StrongTerm st) then | |
| 145 | + lambda(shift(n,_T),replace(shift(n,st),symbol(0),n)), | |
| 146 | + | |
| 147 | + app(StrongTerm f,StrongTerm a) then | |
| 148 | + app(shift(n,f),shift(n,a)), | |
| 149 | + | |
| 150 | + forall(StrongType _T,StrongTerm _E) then | |
| 151 | + forall(shift(n,_T),replace(shift(n,_E),symbol(0),n)), | |
| 152 | + | |
| 153 | + description(StrongTerm p) then | |
| 154 | + description(shift(n,p)), | |
| 155 | + | |
| 156 | + property(StrongTerm p) then | |
| 157 | + property(shift(n,p)), | |
| 158 | + | |
| 159 | + choice(StrongTerm p) then | |
| 160 | + choice(shift(n,p)), | |
| 161 | + | |
| 162 | + parametric(String parameter,StrongTerm st) then | |
| 163 | + parametric(parameter,shift(n,st)), | |
| 164 | + | |
| 165 | + parametric_app(StrongTerm st,StrongType _T) then | |
| 166 | + parametric_app(shift(n,st),shift(n,_T)) | |
| 167 | + }. | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + *** [] Replacement in strong types. | |
| 172 | + | |
| 173 | + _Parameter(N)[a/i] is _Parameter(N) | |
| 174 | + _Defined(N,T_1,...,T_k)[a/i] is _Defined(N,T_1[a/i],...,T_k[a/i]) | |
| 175 | + _Product(T_1,...,T_k)[a/i] is _Product(T_1[a/i],...,T_k[a/i]) | |
| 176 | + _Functional(T,U)[a/i] is _Functional(T[a/i],U[a/i+1]) | |
| 177 | + _Omega[a/i] is _Omega | |
| 178 | + _Witness(E)[a/i] is _Witness(E[a/i]) | |
| 179 | + _Quantified($X T)[a/i] is _Quantified($X T[a/i]) | |
| 180 | + | |
| 181 | + | |
| 182 | +public define StrongType | |
| 183 | + replace // computes 't[a/s(i)]' | |
| 184 | + ( | |
| 185 | + StrongType t, | |
| 186 | + StrongTerm a, | |
| 187 | + Int32 i | |
| 188 | + ) = | |
| 189 | + if t is | |
| 190 | + { | |
| 191 | + _Parameter(String name) then | |
| 192 | + t, | |
| 193 | + | |
| 194 | + _Defined(Int32 type_id,List(StrongType) operands) then | |
| 195 | + _Defined(type_id, | |
| 196 | + map((StrongType st) |-> replace(st,a,i), | |
| 197 | + operands)), | |
| 198 | + | |
| 199 | + _Product(List(StrongType) l) then | |
| 200 | + _Product(map((StrongType st) |-> replace(st,a,i),l)), | |
| 201 | + | |
| 202 | + _Functional(StrongType source,StrongType target) then | |
| 203 | + _Functional(replace(source,a,i),replace(target,a,i+1)), | |
| 204 | + | |
| 205 | + _Omega then | |
| 206 | + _Omega, | |
| 207 | + | |
| 208 | + _Witness(StrongTerm statement) then | |
| 209 | + _Witness(replace(statement,a,i)), | |
| 210 | + | |
| 211 | + _Quantified(String parameter,StrongType _T) then | |
| 212 | + _Quantified(parameter,replace(_T,a,i)) | |
| 213 | + }. | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + *** [] Replacement in strong terms. | |
| 219 | + | |
| 220 | + global(n)[a/i] is global(n) | |
| 221 | + symbol(i)[a/i] is a | |
| 222 | + symbol(i)[a/j] is symbol(i) (if i != j) | |
| 223 | + tuple(t_1,...,t_k)[a/i] is tuple(t_1[a/i],...,t_k[a/i]) | |
| 224 | + proj(n,t)[a/i] is proj(n,t[a/i]) | |
| 225 | + incl(U,n,t)[a/i] is incl(U[a/i],n,t[a/i]) | |
| 226 | + cond(T,t,c_1,...,c_k)[a/i] is cond(T[a/i],t[a/i],c_1[a/i],...,c_k[a/i]) | |
| 227 | + lambda(T,E)[a/i] is lambda(T[a/i],E[a/i+1]) | |
| 228 | + app(f,b)[a/i] is app(f[a/i],b[a/i]) | |
| 229 | + forall(T,E)[a/i] is forall(T[a/i],E[a/i+1]) | |
| 230 | + description(p)[a/i] is description(p[a/i]) | |
| 231 | + property(p)[a/i] is property(p[a/i]) | |
| 232 | + choice(p)[a/i] is choice(p[a/i]) | |
| 233 | + parametric($X,t)[a/i] is parametric($X,t[a/i]) | |
| 234 | + parametric_app(t,T)[a/i] is parametric_app(t[a/i],T[a/i]) | |
| 235 | + | |
| 236 | + | |
| 237 | +public define StrongTerm | |
| 238 | + replace // computes 't[a/i]' | |
| 239 | + ( | |
| 240 | + StrongTerm t, | |
| 241 | + StrongTerm a, | |
| 242 | + Int32 i | |
| 243 | + ) = | |
| 244 | + if t is | |
| 245 | + { | |
| 246 | + global(Int32 id) then | |
| 247 | + t, | |
| 248 | + | |
| 249 | + symbol(Int32 depth) then | |
| 250 | + if depth = i then a else t, | |
| 251 | + | |
| 252 | + tuple(List(StrongTerm) l) then | |
| 253 | + tuple(map((StrongTerm st) |-> replace(st,a,i),l)), | |
| 254 | + | |
| 255 | + proj(Int32 i,StrongTerm st) then | |
| 256 | + proj(i,replace(st,a,i)), | |
| 257 | + | |
| 258 | + incl(StrongType _T,Int32 j,StrongTerm st) then | |
| 259 | + incl(replace(_T,a,i),j,replace(st,a,i)), | |
| 260 | + | |
| 261 | + cond(StrongType _T,StrongTerm test,List(StrongTerm) cases) then | |
| 262 | + cond(replace(_T,a,i),replace(test,a,i), | |
| 263 | + map((StrongTerm c) |-> replace(c,a,i),cases)), | |
| 264 | + | |
| 265 | + lambda(StrongType _T,StrongTerm _E) then | |
| 266 | + lambda(replace(_T,a,i),replace(_E,a,i+1)), | |
| 267 | + | |
| 268 | + app(StrongTerm f,StrongTerm b) then | |
| 269 | + app(replace(f,a,i),replace(b,a,i)), | |
| 270 | + | |
| 271 | + forall(StrongType _T,StrongTerm _E) then | |
| 272 | + forall(replace(_T,a,i),replace(_E,a,i+1)), | |
| 273 | + | |
| 274 | + description(StrongTerm p) then | |
| 275 | + description(replace(p,a,i)), | |
| 276 | + | |
| 277 | + property(StrongTerm p) then | |
| 278 | + property(replace(p,a,i)), | |
| 279 | + | |
| 280 | + choice(StrongTerm p) then | |
| 281 | + choice(replace(p,a,i)), | |
| 282 | + | |
| 283 | + parametric(String parameter,StrongTerm st) then | |
| 284 | + parametric(parameter,replace(st,a,i)), | |
| 285 | + | |
| 286 | + parametric_app(StrongTerm st,StrongType _T) then | |
| 287 | + parametric_app(replace(st,a,i),replace(_T,a,i)) | |
| 288 | + }. | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 0 | 294 | \ No newline at end of file | ... | ... |