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