Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΘΠ06 - Μεταγλωττιστές Ανάνηψη από σφάλματα κατά τη συντακτική ανάλυση.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΘΠ06 - Μεταγλωττιστές Ανάνηψη από σφάλματα κατά τη συντακτική ανάλυση."— Μεταγράφημα παρουσίασης:

1 ΘΠ06 - Μεταγλωττιστές Ανάνηψη από σφάλματα κατά τη συντακτική ανάλυση

2 Ανάνηψη από σφάλματα  Διαδικασία κατά την οποία ανιχνεύεται ένα συντακτικό σφάλμα και συνεχίζεται η ανάλυση για την ανίχνευση περισσότερων λαθών.  Τεχνικές ανάνηψης:  Error Recovery  Error Repair  Error Correction

3 Error Recovery 1. Ανίχνευση συντακτικού λάθους. 2. Αγνόηση μέρους της εισόδου. 3. Aρχικοποίηση περιβάλλοντος αναλυτή (στοίβα, μεταβλητές) για την ανάλυση της υπόλοιπης συμβολοσειράς εισόδου.  Μπορεί να οδηγήσει σε ανίχνευση επόμενων λαθών που δεν είναι στην πραγματικότητα λάθη (cascaded errors) => ποιότητα ανάνηψης από σφάλματα.  Οι φάσεις της σημασιολογικής ανάλυσης και της παραγωγής ενδιάμεσου κώδικα απενεργοποιούνται.  Panic Mode: αναζήτηση για ένα ασφαλές σύμβολο (π.χ. ‘;’) από το οποίο επανεκκινείται η συντακτική ανάλυση.

4 Error Repair  Διαδικασία κατά την οποία ανιχνεύεται ένα σφάλμα και τροποποιείται το κομμάτι της συμβολοσειράς που έχει ήδη αναλυθεί ή το επόμενο του με σκοπό την παραγωγή μίας έγκυρης εισόδου.  Εισαγωγή/διαγραφή τερματικών συμβόλων.  x=a b+c; //εισαγωγή του συμβόλου ‘=‘ ή ’+’ κτλ. μετά το a  Οι επόμενες φάσεις συνεχίζονται κανονικά.  Διορθωμένα συντακτικά σφάλματα μπορεί να δημιουργήσουν σφάλματα για τις επόμενες φάσεις.

5 Error Correction  Ό,τι και στην τεχνική του Error Repair με τη διαφορά ότι οι τροποποιήσεις της εισόδου αντικατοπτρίζουν το τί ήθελε ο χρήστης να γράψει.

6 Error Recovery στον Bison (1/3)  Προκαθορισμένη συμπεριφορά κατά την ανίχνευση σφάλματος:  κλήση yyerror() για την εκτύπωση διαγνωστικού μηνύματος  τερματισμός  %error-verbose: οδηγία για πιο κατατοπιστικά μηνύματα  Η προκαθορισμένη συμπεριφορά δεν υλοποιεί Error Recovery.

7 Error Recovery στον Bison (2/3)  Ειδικό σύμβολο γραμματικής: error  Παράγεται όταν ανιχνευθεί ένα συντακτικό σφάλμα.  error : Όταν ανιχνευθεί σφάλμα, σηματοδοτεί μέχρι που θα πρέπει να αγνοηθεί η είσοδος, ώστε να συνεχίσει η συντακτική ανάλυση.  stmt: error ‘;’ ; // είσοδος y = d; x = a b;  Στοίβα: stmt ‘x’ ‘=‘ ‘a’, lookahead: ‘b’  Ανιχνεύεται σφάλμα=>  εξάγονται τα ‘x’, ‘=‘, ‘a (Στοίβα: stmt)  shift του error (Στοίβα: stmt error)  διαγραφή ‘b’, lookahead: ‘;’  Στοίβα: stmt error ‘;’ => Στοίβα: stmt stmt

8 Error Recovery στον Bison (3/3)  error: Μόλις ενεργοποιηθεί το σύμβολο καλείται η yyerror()  yyerrok: μακροεντολή για την ένδειξη τέλους φάσης Error Recovery  Φειδώ στη χρήση του error:  δημιουργία συγκρούσεων  αναφορά λαθών που δεν υπάρχουν  “Error recovery strategies are necessarily guesses. When they guess wrong, one syntax error often leads to another.”

9 Παράδειγμα v1.0 (1/3) %{ #include void yyerror (char const *s); extern int num_lines; %} %token TK_NUM TK_ID TK_BADID %left '-' '+' %left '*' '/' %left TK_NEG /* negation--unary minus */ %right '^' /* exponentiation */ % /* The grammar follows. */ input: /* empty */ | input line ; line: ';' | exp ';' ;

10 Παράδειγμα v1.0 (2/3) exp: TK_NUM | TK_ID | exp '+' exp {printf("exp + exp\n");} | exp '-' exp {printf("exp - exp\n");} | exp '*' exp {printf("exp * exp\n");} | exp '/' exp {printf("exp / exp\n");} | '-' exp %prec TK_NEG {printf("-exp\n");} | exp '^' exp {printf("exp ^ exp\n");} | '(' exp ')' {printf("( exp )\n");} ; % int main(void) { return yyparse(); } void yyerror (char const *s) { printf("%d: %s\n", num_lines, s); }

11 Παράδειγμα v1.0 (3/3) Έξοδος: 1: syntax error Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

12 Παράδειγμα v1.1 Έξοδος: 1: syntax error, unexpected TK_NUM Προσθήκη: %error-verbose Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

13 Παράδειγμα v1.2 (1/2) %{ #include void yyerror (char const *s); extern int num_lines; %} %error-verbose %token TK_NUM TK_ID TK_BADID %left '-' '+' %left '*' '/' %left TK_NEG /* negation--unary minus */ %right '^' /* exponentiation */ % /* The grammar follows. */ input: /* empty */ | input line ; line: ';' | exp ';‘ | error ';‘ {yyerrok;} ;

14 Παράδειγμα v1.2 (2/2) Έξοδος:  1: syntax error, unexpected TK_NUM  2: syntax error, unexpected TK_BADID  exp + exp  ( exp )  5: syntax error, unexpected ';'  exp + exp  7: syntax error, unexpected ')'  exp * exp Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

15 Παράδειγμα v1.3 (1/2) exp: TK_NUM | TK_ID | TK_BADID {yyerror("invalid ID"); YYERROR; yyerrok;} | exp '+' exp {printf("exp + exp\n");} | exp '-' exp {printf("exp - exp\n");} | exp '*' exp {printf("exp * exp\n");} | exp '/' exp {printf("exp / exp\n");} | '-' exp %prec TK_NEG {printf("-exp\n");} | exp '^' exp {printf("exp ^ exp\n");} | '(' exp ')' {printf("( exp )\n");} ; % int main(void) { return yyparse(); } void yyerror (char const *s) { printf("%d: %s\n", num_lines, s); }

16 Παράδειγμα v1.3 (2/2) Έξοδος:  1: syntax error, unexpected TK_NUM  2: invalid ID  exp + exp  ( exp )  5: syntax error, unexpected ';'  exp + exp  7: syntax error, unexpected ')'  exp * exp Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

17 Παράδειγμα v1.4 (1/2) %{ #include void yyerror (char const *s); extern int num_lines; %} %error-verbose %token TK_NUM TK_ID TK_BADID %left '-' '+' %left '*' '/' %left TK_NEG /* negation--unary minus */ %right '^' /* exponentiation */ % /* The grammar follows. */ input: /* empty */ | input line ; line: ';' | exp ';‘ | exp error exp ';' {yyerror("missing arithmetic operator or ';'"); yyerrok;} | error ';‘ {yyerrok;} ;

18 Παράδειγμα v1.4 (2/2) Έξοδος:  1: syntax error, unexpected TK_NUM  1: missing arithmetic operator or ';'  2: invalid ID  exp + exp  ( exp )  5: syntax error, unexpected ';‘  exp + exp  7: syntax error, unexpected ')'  exp * exp  8: missing arithmetic operator or ';' Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

19 Παράδειγμα v1.5 (1/2) exp: TK_NUM | TK_ID | TK_BADID {yyerror("invalid ID"); YYERROR; yyerrok;} | exp '+' exp {printf("exp + exp\n");} | exp '-' exp {printf("exp - exp\n");} | exp '*' exp {printf("exp * exp\n");} | exp '/' exp {printf("exp / exp\n");} | '-' exp %prec TK_NEG {printf("-exp\n");} | exp '^' exp {printf("exp ^ exp\n");} | '(' exp ')' {printf("( exp )\n");} | '(' exp error {yyerror("Missing operator ')'"); yyerrok;} ; % int main(void) { return yyparse(); } void yyerror (char const *s) { printf("%d: %s\n", num_lines, s); }

20 Παράδειγμα v1.5 (2/2) Έξοδος:  1: syntax error, unexpected TK_NUM  1: missing arithmetic operator or ';'  2: invalid ID  exp + exp  ( exp )  5: syntax error, unexpected ';‘  5: Missing operator ')'  exp + exp  7: syntax error, unexpected ')'  exp * exp  8: missing arithmetic operator or ';' Είσοδος: 1. sdf 1234; fsdf + 234; asf; 4. (2345); 5. (asdf; ; ); * 234;

21 Αναφορές  Εγχειρίδιο χρήσης Bison. son.html.gz. son.html.gz  Charles Fischer, University of Wisconsin, Richard LeBlanc. Crafting a Compiler with C. Addison-Wesley, 1991.


Κατέβασμα ppt "ΘΠ06 - Μεταγλωττιστές Ανάνηψη από σφάλματα κατά τη συντακτική ανάλυση."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google