ΘΠ06 - Μεταγλωττιστές Εισαγωγή στον Bison Φροντιστήριο - 23/03/2010
Τι είναι ο Bison Ο bison είναι μια βελτίωση του εργαλείου yacc του Unix. O yacc είναι μια γεννήτρια συντακτικών αναλυτών: δέχεται μια γραμματική χωρίς συμφραζόμενα (LALR(1)) και παράγει έναν συντακτικό αναλυτή σε C/C++ Η παραγώμενη συνάρτηση yyparse αναγνωρίζει τις συμβολοσειρές εισόδου, κατασκευάζει το συντακτικό δέντρο και εκτελεί τις ενέργειες που περιγράφονται στο πρόγραμμα
Δομή Προγράμματος %{ Κώδικας C/C++ (μακροεντολές, τύποι δεδομένων, δηλώσεις μεταβλητών και συναρτήσεων) %} Δηλώσεις Bison % Κανόνες παραγωγής γραμματικής % Κώδικας C/C++ (υλοποίηση συναρτήσεων, main() )
Δηλώσεις Bison Δηλώσεις λεκτικών μονάδων %token TK_ID %token TK_IF, TK_ELSE Δηλώσεις τελεστών της γλώσσας και της προτεραιότητας και προσεταιριστικότητας τους %nonassoc ‘=‘ ‘ ’ %left ‘+’ ‘-’ %left ‘*’ ‘/’ TK_div, TK_mod Δήλωση του συνόλου των σημασιολογικών τιμών και του τύπου κάθε συμβόλου (στην επόμενη φάση της εργασίας)
Προτεραιότητα και Προσεταιριστικότητα Τελεστών (1/2) Τα %left, %right δηλώνουν τις προσεταιριστικότητες των tokens που τα ακολουθούν. Η σειρά δήλωσής τους καθορίζει την προτεραιότητα των αντίστοιχων τελεστών. Ισχύουν τα εξής: τα tokens που εμφανίζονται στην ίδια γραμμή έχουν την ίδια προτεραιότητα η προτεραιότητα αυξάνεται από πάνω προς τα κάτω
Προτεραιότητα και Προσεταιριστικότητα Τελεστών (2/2) Π.χ. %left ‘+’ ‘-’ %left ‘*’ ‘/’ TK_DIV TK_MOD Τα ‘+’ και ‘-’ έχουν μικρότερη προτεραιότητα από τα ‘*’ και ‘/’ Η έκφραση a+b+c υπολογίζεται ως (a+b)+c Το %nonassoc χρησιμοποιείται για τελεστές που δεν μπορούν να συνδυαστούν μεταξύ τους, π.χ., το ‘=‘ Το %prec δηλώνει τη προτεραιότητα μέσα σε έναν κανόνα της γραμματικής
Κανόνες Παραγωγής Γραμματικής Η περιγραφή της γραμματικής της γλώσσας γίνεται με κανόνες παραγωγής διατυπωμένους σε BNF μορφή Γενική μορφή κανόνων: αριστερό_μέλος: δεξιό_μέλος; Το αριστερό_μέλος είναι ένα μη τερματικό σύμβολο Το δεξιό_μέλος μπορεί να περιέχει μηδέν ή περισσότερα τερματικά και μη τερματικά σύμβολα π.χ., expression: term TK_PLUS expression ; Kατά σύμβαση, τα τερματικά σύμβολα παριστάνονται με κεφαλαία ενώ τα μη τερματικά με πεζά
Κανόνες Παραγωγής Γραμματικής Μπορούν να δίνονται περισσότερα εναλλακτικά δεξιά μέλη: arithmetic_expr: TK_NUM | arithmetic_expr ‘+’ arithmetic_expr | arithmetic_expr ‘-’ arithmetic_expr | arithmetic_expr ‘*’ arithmetic_expr | arithmetic_expr ‘/’ arithmetic_expr | ‘-’ arithmetic_expr %prec UMINUS | ‘(‘ arithmetic_expr ‘)’ ; id_list:/* empty */ | TK_ID | TK_ID TK_COMMA id_list;
Flex και Bison Στο πρώτο μέρος του αρχείου bison ( robin.y) δηλώνεται η συνάρτηση για το χειρισμό λαθών : void yyerror(const char *) Η προκαθορισμένη συνάρτηση λεκτικής ανάλυσης που καλείται από τη yyparse() είναι η yylex() Στο αρχείο flex : αφαιρούμε τις δηλώσεις των tokens (τις προσθέτουμε στο αρχείο bison) προσθέτουμε το αρχείο.c που παράγεται από τον bison ή το αρχείο.h που παράγεται με το διακόπτη –d #include “robin.tab{.c,.h}” αφαιρούμε τη main() και γράφουμε μία αντίστοιχη στο robin.y χρησιμοποιώντας τη yyparse()
Διαδικασία Παραγωγής Συντακτικού Αναλυτή Bison compiler Flex compiler C compiler Flex source program robin.l Bison source program robin.y a.out robin.tab.h lex.yy.c robin.tab.c a.out Input stream Sequence of grammar rules -d robin.tab.c lex.yy.c