Γλώσσες Προγραμματισμού Μεταγλωττιστές Ασκήσεις Επανάληψης ) Περιγράψτε τις κανονικές εκφράσεις που υποστηρίζουν (i) συμβολοσειρές που ξεκινούν με το πρόθεμα "func" ή "endfunc" ακολουθούμενο το σύμβολο "-"και από ένα ή περισσότερα γράμματα πχ. func-doule, func-computetring, func-, endfunc- (func endfunc)-([-za-z])+ (ii) ένα ή περισσότερα γράμματα ακολουθούμενα από το σύμβολο "_" (underscore) και από ένα ή περισσότερα ψηφία. πχ. vr_78, complexvr_67877, _8 ([-z]+)_([-9])+ (iii) συμβολοσειρές που αποτελούνται από και, όπου κάθε έχει πριν και μετά τουλάχιστον ένα. πχ. ενώ απορρίπτονται οι, και. Να δοθεί το αντίστοιχο ντετερμινιστικό πεπερασμένο αυτόματο, (μπορείτε να το σχεδιάσετε και να το δοκιμάσετε στο εργαλείο JFLAP) και η αντίστοιχη κανονική γραμματική (Άσκηση 2.-3 Σκορδαλάκης-Παπασπύρου Μεταγλωττιστές). Κανονική έκφραση ( )* Γραμματική ::=D D::=ε D::=D D::=D ή (χωρίς κενές μεταβάσεις) ::= ::=D D::= D::= D::=D D::=D (iv) συμβολοσειρές με μήκος τουλάχιστον 2 που περιέχουν τουλάχιστον ένα, οι οποίες όταν ξεκινούν από τότε η υπόλοιπη συμβολοσειρά πρέπει να έχει άρτιο αριθμό, ενώ όταν ξεκινούν από η υπόλοιπη συμβολοσειρά πρέπει να έχει περιττό αριθμό, πχ, και,,. Να δοθεί το αντίστοιχο ντετερμινιστικό πεπερασμένο αυτόματο, (μπορείτε να το σχεδιάσετε και να το δοκιμάσετε στο εργαλείο JFLAP) και η αντίστοιχη κανονική γραμματική. Κανονική έκφραση: ( *)*( *)* Γραμματική: ::= ::=C ::= ::=C C::=C C::=D D::=ε D::=C D::=D Α Α Β Γ Β C D
2) Να δοθεί πεπερασμένο ντετερμινιστικό αυτόματο το οποίο να αναγνωρίζει συμβολοσειρές αποτελούμενες από ψηφία (-9) οι οποίες αναπαριστούν φυσικούς αριθμούς οι οποίοι διαιρούνται ακριβώς με το 3. (Άσκηση 2.3 Σκορδαλάκης-Παπασπύρου Μεταγλωττιστές). Δείτε αρχείο JFLAP στην ιστοσελίδα του μαθήματος. 3) Υλοποιείστε τις κανονικές εκφράσεις της άσκησης () σε ένα αρχείο FLEX, έτσι ώστε όταν οι αντίστοιχες συμβολοσειρές βρίσκονται μέσα σε ένα αρχείο εισόδου, να τυπώνεται ο αριθμός γραμμής του αρχείου που εμφανίζονται στην οθόνη και η αντίστοιχη συμβολοσειρά που ικανοποιεί τις κανονικές εκφράσεις. 4) Έστω η γραμματική και η συμβολοσειρά αα+αα** ::= + * α) Δώστε την αριστερότερη παραγωγή της συμβολοσειράς. β) Δώστε την δεξιότερη παραγωγή της συμβολοσειράς γ) Δώστε το συντακτικό δένδρο της συμβολοσειράς για την συγκεκριμένη γραμματική. α) =>*=>+*=>+*=>+*=>+**=>+**=>+** β) =>*=>**=>**=>**=>+**=>+**=>+** γ) Το συντακτικό δένρο είναι * + *
5) Η παρακάτω γραμματική είναι διφορούμενη? Δώστε ένα παράδειγμα (δηλαδή μια συμβολοσειρά που αντιστοιχεί σε δύο συντακτικά δένδρα) που να αποδεικνύει το ισχυρισμό σας. ::="" Β "" ::="" ::= "" ::=ε ε Ναι γιατί για παράδειγμα η συμβολοσειρά έχει δύο συντακτικά δένδρα. ε 6) Εφαρμόστε αριστερή παραγοντοποίηση και τις απαραίτητες αντικαταστάσεις στην ακόλουθη γραμματική: ::=c dec C g ::=de C::=def Με αντικατάσταση της Β και της C το πρώτο σύνολο κανόνων γίνεται: ::=dec dedef def g και με παραγοντοποίηση: ::=de' g '::=c def f
7) Είναι η ακόλουθη γραμματική LL; Αν όχι κάντε τους απαραίτητους μετασχηματισμούς ώστε να γίνει LL. ::= + * Όχι η γραμματική δεν είναι LL, καθώς είναι αριστερά αναδρομική. Οι μετασχηματισμοί που πρέπει να γίνουν είναι οι ακόλουθοι. (α) (παραγοντοποίηση) ::= ::=+ * (απαλοιφή αριστερής αναδρομής) (β) (απαλοιφή αριστερής αναδρομής) (παραγοντοποίηση) ::=C C::=C ε ::=+ * ::=C C::=+C *C e ::=C C::= e ::=+C *C 8). Έστω η ακόλουθη γραμματική: ::= Να κατασκευαστεί ο LL πίνακας συντακτικής ανάλυσης αφού γίνουν στη γραμματική οι κατάλληλες μετατροπές. Απάντηση ::= ::= FIRT()={} FIRT()={,} FOLLOW()={,EOF} FOLLOW()={,EOF} Πίνακας LL EOF ::= ::= ::=
9) Υπολογίστε τα σύνολα FIRT και FOLLOW για την γραμματική της άσκησης (7) και να κατασκευάσετε τον LL πίνακα συντακτικής ανάλυσης. H τροποποιημένη γραμματική είναι: ::=C C::=C ε ::=+ * Οι συναρτήσεις FIRT και FOLLOW υπολογίζονται: FIRT()={} FIRT()={+,*} FIRT(C)={ε + FIRT()}={ε,} FOLLOW()={EOF,+FIRT()}={EOF,+,*} FOLLOW(C)=FOLLOW()={EOF,+,*} FOLLOW()={(FIRT(C)-ε))+FOLLOW(C)}={+FOLLOW()}={,EOF,+,*} Ο πίνακας LL δίνεται παρακάτω: FIRT(C)={} FIRT(C)={} FIRT(ε) = {ε} FIRT(+)={+} FIRT(-)={-} * + EOF * + C ε ε C ε C
) Να υπολογιστεί ο LR πίνακας συντακτικής ανάλυσης για την γραμματική ::= Επαυξημένη Γραμματική '::= () ::= (2) ::= FIRT()={} FOLLOW()={,EOF} I ={'::=,::=, ::= } GOTO(I,)={::=, ::=,::=, ::= } = I GOTO(I,)={'::= }=I 2 GOTO(I,)={::=, ::=,::=, ::= } = I GOTO(I,)={::= }=I 3 GOTO(I,)={::= }=I 4 GOTO(I 4,)={::= }=I 5 Σύμβολα Καταστάσεις EOF s 2 s s3 4 2 3 r cc r 4 s5 5 r2 r2 Για παράδειγμα: Κατάσταση, σύμβολο : Στην κατάσταση Ι, υπάρχει το στοιχείο ::=, και GOTO(I,)=I 3 άρα shift3 (s3). Κατάσταση 3, σύμβολο και EOF: Στην κατάσταση Ι3, υπάρχει το ::= και FOLLOW()={,EOF}, άρα reduce με τον κανόνα :: για σύμβολα και EOF, που είναι ο κανόνας (r). Κατάσταση 2: I 2 ={'::= } άρα cc για το EOF.
) Δώστε την αναπαράσταση στην γλώσσα των τετράδων των ακόλουθων προγραμμάτων: ++2*23+8 :+,,, t 2 :*, 2, 23, t2 3 :+, t, t2, t3 4 :+, t3, 8, t4 5 :=, t4, -, x if x>2+3 then x:=8+23 6 :+, 2, 3, t5 7 :>, x, t5, 9 8 :jump, -, -, 2 9 :+, 8, 23, t6 2 :=, t6, -, x 2 :... if x>2 nd y<2 then if z=3 or f> then s:= 2 :>, x, 2, 23 22 :jump, -, -, 3 23 :<, y, 2, 25 24 :jump, -, -, 3 25 :=, z, 3, 29 26 :jump, -, -, 27 27 :>, f,, 29 28 :jump, -, -, 3 29 :=,, -, s 3 :...