Πέμπτη, 13 Ιουνίου 2019

Αναθεώρηση 26 Έκδοση 9.8


1. Μια μικρή διόρθωση για τον χρωματιστή κώδικα όταν έχουμε μετά από TOTE και ΑΛΛΙΩΣ ετικέτα τύπου αριθμός (είναι σαν να υπάρχει η ΠΡΟΣ πριν τον αριθμό). Εδώ στο παράδειγμα το 100 και το 120 έχουν ενδιάμεσα το else και χρωματίζεται μπλε (αναγνωριστικό της Μ2000).
Module TestMe {
 090 if random(1,2)=1 then 100 else 120
 100 Print "100"
 110 End
 120 Print "120"
 130 End
}
For i=1 to 10 : TestMe : Next

2. Προχωράει ο Ast Interpreter.
Για την ώρα δεν εκελείται ο μεταφρασμένος κώδικας. Αυτό που κάνει το παρακάτω πρόγραμμα είναι να εμφανίζει με ? τη λίστα από το lexical analyzer, που έχει ήδη φτιαχτεί με "γνώση" όπως ξέρει τα σταθερά (πχ το 100 ή το "ασδασδ") δηλαδή ποιοι είναι αριθμοί, ποια είναι αλφαριθμητικά, και επιπλέον έχει εξαφανίσει διαστήμα (white space), και σημειώσεις. Επιπλέον έχει υπολογίσει ποια είναι tuple (πχ το (1,2,3,4) είναι tuple), έχει υπολογίσει για κάθε ανοικτή παρένεθεση που είναι το επόμενο σύμβολο μετά το κλείσιμο παρένθεσης. Ομοίως έχει υπολογίσει για τις αγκύλες { }.

Αυτό που με ενδιαφέρει τώρα είναι να κάνω όλες τις δομές (πχ το Αν Τέλος Αν, το οποίο δουλεύει με Αν { } δηλαδή με μπλοκ και χωρίς μπλοκ) να έχουν προυπολογίσει τα σημεία "εξόδου" ή όπως φαίνονται στο κείμενο του AST ως skip number

Στο τέλος το AST έχει βρει πόσοι αριθμοί και αλφαριθμητικά έχουμε χρησιμοποιήσει (υπολογίζει και τα αλφαριθμητικά με αγκύλες και πολλές γραμμές), και αναγνωριστικά (καταγράφει το καθένα μια φορά).


Ο τρόπος που δουλεύει ο lexical analyzer μοιάζει με εκείνο του χρωματιστή κώδικα. Η διαφορά είναι ότι ο χρωματισμός γίνεται πιο "σοβαρός" από το χρωματιστή κώδικα, γιατί θέλουμε περισσότερα αποτελέσματα και όχι απλά να φαίνεται χρωματισμένος κώδικας. Για το λόγο αυτό υπάρχει το αντικείμενο κλάσης Lexar το οποίο φορτώνει κώδικα και καλεί γεγονότα. Εντός της Lexar υπάρχει το αντικείμενο Document το οποίο σπάει το κείμενο σε παραγράφους και στέλνει κάθε γραμμή για χρωμάτισμα με γεγονότα στην Lexar. Ενδέχεται μια γραμμή να χρωματίσει και επόμενες, έτσι η Document αν βλέπει ήδη μια γραμμή χρωματισμένη την αφήνει. Υπάρχει μια κλάση CodeBlock η οποία δημιουργεί την κλάση Lexar και συνδέει τα γεγονότα της με αυτήν. Έτσι το τελικό διαμορφώνεται από τις τρεις κλάσεις, με γεγονότα από το Document στο Lexar και μετά στο CodeBlock. Προς το παρόν το CodeBlock έχει μια μέθοδο που κάνει εμφάνιση γραμμών στην κονσόλα της Μ2000, με σταμάτημα σε κάθε 3/4 του ύψους της κονσόλας. Αυτό με βοηθάει να εξετάζω το αποτέλεσμα. Έτσι πριν προχωρήσω στην εκτέλεση του αποτελέσματος θέλω να είμαι σίγουρος ότι κάνει όλα αυτά που θέλω να κάνει (και είναι πάρα πολλά, προφανώς θα έχω να διορθώνω αρκετά, αν δεν πετύχω μια ευνοική κωδικοποίηση στο AST). Αν και το λέμε tree είναι ένα πίνακας στοιχείων όπου όμως υπάρχει πεδίο για σύνδεση με άλλο σημείο. και αυτό ήδη το εκμεταλλεύομαι για να σημαδεύω σε μια αρχή παρένθεσης ή μπλοκ το τέλος του. Εσωτερικά το Lexar έχει και έναν σωρό τιμών (τον χρησιμοποιώ σαν στοίβα) για να μπορώ να κλείνω σωστά τα μέρη κώδικα.
Υπάρχουν μερικά Stop στο κώδικα της VB6 για να με βοηθούν να βλέπω πότε συμβαίνουν πράγματα που δεν θέλω!

Εδώ είναι το αρχείο με το κώδικα ως τώρα (θα το ανανεώνω τακτικά) AST Interprerter

MODULE Pythagoras_tree {
 CLS 5, 0  ' MAGENTA, NO SPLIT SCREEN
 PEN 14   ' YELLOW
 \\ code from zkl/Free Basic
 LET w = scale.x, h = w * 11 div 16
 LET w2 = w div 2, diff = w div 12
 LET TreeOrder = 6
 pythagoras_tree(w2 - diff, h -10, w2 + diff, h -10, 0)
 
 SUB pythagoras_tree(x1, y1, x2, y2, depth)
 
     IF depth > TreeOrder THEN EXIT SUB
 
     LOCAL dx = x2 - x1, dy = y1 - y2
     LOCAL x3 = x2 - dy, y3 = y2 - dx
     LOCAL x4 = x1 - dy, y4 = y1 - dx
     LOCAL x5 = x4 + (dx - dy) / 2
     LOCAL y5 = y4 - (dx + dy) / 2
     MOVE x1, y1
     DRAW TO x2, y2
     DRAW TO x3, y3
     DRAW TO x4, y4
     DRAW TO x1, y1
     pythagoras_tree(x4, y4, x5, y5, depth +1)
     pythagoras_tree(x5, y5, x3, y3, depth +1)
 
 END SUB
}
Pythagoras_tree

Στην κλάση CodeBlock υπάρχει αυτό:
Private Type ast
    codepos As Long
    codetype As Integer
    codehelp As Integer
    codevar As Long
End Type

Δηλαδή κάθε εγγραφή έχει 4+2+2+4 bytes, και υπάρχει βοηθητικός χώρος για τα αναγνωριστικά (γράφονται μια φορά), για αριθμούς και αλφαριθμητικά. Προς το παρόν το 5 αν υπάρχει δυο φορές θα γραφτεί δυο φορές (δεν το έχω βάλει να κάνει αναζήτηση σε πίνακα, δηλαδή ξοδεύω μνήμη, η οποία όμως έχει γρηγορότερη προσπέλαση). Ομοίως για τα αλφαριθμητικά.

Στην εμφάνιση αλλάζει κάπως:
Το πρώτο νούμερο είναι ο αριθμός του στοιχείου. Το δεύτερο είναι η θέση του στο κώδικα. Ακολουθεί το σύμβολο (μας λέει και τι είναι)

Νεότερη έκδοση!

 0 1 11 Identifier:MODULE
 1 8 161 Identifier:PYTHAGORAS_TREE
 2 25 140 START BRACKET 210
 3 24 0
 4 28 11 Identifier:CLS
 5 32 100  5 Double
 6 33 8 ,
 7 35 100  0 Double
 8 63 0
 9 67 11 Identifier:PEN
 10 71 100  14 Double
 11 83 0
 12 117 11 Identifier:LET
 13 121 161 Identifier:W
 14 123 14 =
 15 125 11 Identifier:SCALE.X
 16 132 8 ,
 17 134 161 Identifier:H
 18 136 14 =
 19 138 161 Identifier:W
 20 140 14 *
 21 142 100  11 Double
 22 145 11 Identifier:DIV
 23 149 100  16 Double
 24 150 0
 25 154 11 Identifier:LET
 26 158 161 Identifier:W2
 27 161 14 =
 28 163 161 Identifier:W
 29 165 11 Identifier:DIV
 30 169 100  2 Double
 31 170 8 ,
 32 172 161 Identifier:DIFF
 33 177 14 =
 34 179 161 Identifier:W
 35 181 11 Identifier:DIV
 36 185 100  12 Double
 37 186 0
 38 190 11 Identifier:LET
 39 194 161 Identifier:TREEORDER
 40 204 14 =
 41 206 100  6 Double
 42 206 0
 43 210 165 Identifier:PYTHAGORAS_TREE( skip to 62
 44 226 161 Identifier:W2
 45 229 14 -
 46 231 161 Identifier:DIFF
 47 235 8 ,
 48 237 161 Identifier:H
 49 239 14 -
 50 240 100  10 Double
 51 242 8 ,
 52 244 161 Identifier:W2
 53 247 14 +
 54 249 161 Identifier:DIFF
 55 253 8 ,
 56 255 161 Identifier:H
 57 257 14 -
 58 258 100  10 Double
 59 260 8 ,
 60 262 100  0 Double
 61 263 19 )
 62 263 0
 63 270 111 SUB
 64 274 165 Identifier:pythagoras_tree( skip to 75
 65 290 161 Identifier:X1
 66 292 8 ,
 67 294 161 Identifier:Y1
 68 296 8 ,
 69 298 161 Identifier:X2
 70 300 8 ,
 71 302 161 Identifier:Y2
 72 304 8 ,
 73 306 161 Identifier:DEPTH
 74 311 19 )
 75 311 0
 76 322 11 Identifier:IF
 77 325 161 Identifier:DEPTH
 78 331 14 >
 79 333 161 Identifier:TREEORDER
 80 343 11 Identifier:THEN
 81 348 11 Identifier:EXIT
 82 353 11 Identifier:SUB
 83 355 0
 84 366 11 Identifier:LOCAL
 85 372 161 Identifier:DX
 86 375 14 =
 87 377 161 Identifier:X2
 88 380 14 -
 89 382 161 Identifier:X1
 90 384 14 ,
 91 386 161 Identifier:DY
 92 389 14 =
 93 391 161 Identifier:Y1
 94 394 14 -
 95 396 161 Identifier:Y2
 96 397 0
 97 405 11 Identifier:LOCAL
 98 411 161 Identifier:X3
 99 414 14 =
 100 416 161 Identifier:X2
 101 419 14 -
 102 421 161 Identifier:DY
 103 423 14 ,
 104 425 161 Identifier:Y3
 105 428 14 =
 106 430 161 Identifier:Y2
 107 433 14 -
 108 435 161 Identifier:DX
 109 436 0
 110 444 11 Identifier:LOCAL
 111 450 161 Identifier:X4
 112 453 14 =
 113 455 161 Identifier:X1
 114 458 14 -
 115 460 161 Identifier:DY
 116 462 14 ,
 117 464 161 Identifier:Y4
 118 467 14 =
 119 469 161 Identifier:Y1
 120 472 14 -
 121 474 161 Identifier:DX
 122 475 0
 123 483 11 Identifier:LOCAL
 124 489 161 Identifier:X5
 125 492 14 =
 126 494 161 Identifier:X4
 127 497 14 +
 128 499 17 ( skip to 133
 129 500 161 Identifier:DX
 130 503 14 -
 131 505 161 Identifier:DY
 132 507 19 )
 133 509 14 /
 134 511 100  2 Double
 135 511 0
 136 519 11 Identifier:LOCAL
 137 525 161 Identifier:Y5
 138 528 14 =
 139 530 161 Identifier:Y4
 140 533 14 -
 141 535 17 ( skip to 146
 142 536 161 Identifier:DX
 143 539 14 +
 144 541 161 Identifier:DY
 145 543 19 )
 146 545 14 /
 147 547 100  2 Double
 148 547 0
 149 555 11 Identifier:MOVE
 150 560 161 Identifier:X1
 151 562 8 ,
 152 564 161 Identifier:Y1
 153 565 0
 154 573 11 Identifier:DRAW
 155 578 11 Identifier:TO
 156 581 161 Identifier:X2
 157 583 8 ,
 158 585 161 Identifier:Y2
 159 586 0
 160 594 11 Identifier:DRAW
 161 599 11 Identifier:TO
 162 602 161 Identifier:X3
 163 604 8 ,
 164 606 161 Identifier:Y3
 165 607 0
 166 615 11 Identifier:DRAW
 167 620 11 Identifier:TO
 168 623 161 Identifier:X4
 169 625 8 ,
 170 627 161 Identifier:Y4
 171 628 0
 172 636 11 Identifier:DRAW
 173 641 11 Identifier:TO
 174 644 161 Identifier:X1
 175 646 8 ,
 176 648 161 Identifier:Y1
 177 649 0
 178 657 165 Identifier:PYTHAGORAS_TREE( skip to 191
 179 673 161 Identifier:X4
 180 675 8 ,
 181 677 161 Identifier:Y4
 182 679 8 ,
 183 681 161 Identifier:X5
 184 683 8 ,
 185 685 161 Identifier:Y5
 186 687 8 ,
 187 689 161 Identifier:DEPTH
 188 695 14 +
 189 696 100  1 Double
 190 697 19 )
 191 697 0
 192 705 165 Identifier:PYTHAGORAS_TREE( skip to 205
 193 721 161 Identifier:X5
 194 723 8 ,
 195 725 161 Identifier:Y5
 196 727 8 ,
 197 729 161 Identifier:X3
 198 731 8 ,
 199 733 161 Identifier:Y3
 200 735 8 ,
 201 737 161 Identifier:DEPTH
 202 743 14 +
 203 744 100  1 Double
 204 745 19 )
 205 745 0
 206 752 11 Identifier:END
 207 756 11 Identifier:SUB
 208 758 0
 209 761 141 END BRACKET 3
 210 761 0
 211 764 161 Identifier:PYTHAGORAS_TREE
 212 778 0
Number Literals: 15
String Literals: 1
Identifiers: 36

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου