HY 340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

43
HY HY 340 340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης Αντώνιος Σαββίδης

description

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ. HY 340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ. ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης. HY 340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ. Φροντιστήριο 2 ο Εισαγωγή στο YACC. Yacc. Μια γεννήτρια συντακτικών αναλυτών για τις γλώσσες C/C++ - PowerPoint PPT Presentation

Transcript of HY 340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Page 1: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

HYHY340340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ,

ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ,ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ,

ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ

ΔΙΔΑΣΚΩΝΔΙΔΑΣΚΩΝΑντώνιος ΣαββίδηςΑντώνιος Σαββίδης

Page 2: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

HYHY340340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Φροντιστήριο Φροντιστήριο 22οοΕισαγωγή στο Εισαγωγή στο YACCYACC

HY340, 2012 Slide 2 / 43Α. Σαββίδης

Page 3: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

YaccYacc

Μια γεννήτρια συντακτικών αναλυτών για Μια γεννήτρια συντακτικών αναλυτών για τις γλώσσες τις γλώσσες C/C++C/C++

Μετατρέπει την περιγραφή μιας Μετατρέπει την περιγραφή μιας context-context-free free γραμματικής σε ένα γραμματικής σε ένα LALR LALR συντακτικό συντακτικό αναλυτή γραμμένοαναλυτή γραμμένοLALRLALR = = LLook-ook-AAhead head LLeft-to-right parse, eft-to-right parse,

RRightmost-derivationightmost-derivation Θα χρησιμοποιήσουμε το Θα χρησιμοποιήσουμε το bisonbison, , μια μια

βελτιωμένη έκδοση του βελτιωμένη έκδοση του yaccyacc

HY340, 2012 Slide 3 / 43Α. Σαββίδης

Page 4: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δομή Προγράμματος Δομή Προγράμματος YaccYacc

%{%{

ΠρόλογοςΠρόλογος

%}%}

Δηλώσεις Δηλώσεις yaccyacc

%%%%

Περιγραφή γραμματικήςΠεριγραφή γραμματικής

%%%%

Επίλογος (προαιρετικό)Επίλογος (προαιρετικό)

HY340, 2012 Slide 4 / 43Α. Σαββίδης

Page 5: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠρόλογοςΠρόλογος Ο πρόλογος μπορεί να περιέχει δηλώσεις Ο πρόλογος μπορεί να περιέχει δηλώσεις macrosmacros, ,

συναρτήσεων και μεταβλητών.συναρτήσεων και μεταβλητών. Ότι προστίθεται σε αυτό το τμήμα αντιγράφεται χωρίς Ότι προστίθεται σε αυτό το τμήμα αντιγράφεται χωρίς

αλλαγές στην αρχή του παραγόμενο αρχείο αλλαγές στην αρχή του παραγόμενο αρχείο .c .c που περιέχει που περιέχει τον κώδικα του συντακτικού αναλυτήτον κώδικα του συντακτικού αναλυτή

Το τμήμα αυτό είναι προαιρετικό και μπορεί να παραληφθεί Το τμήμα αυτό είναι προαιρετικό και μπορεί να παραληφθεί αφαιρώντας τα διαχωριστικά %{ και %} αφαιρώντας τα διαχωριστικά %{ και %}

Μπορούμε επίσης να έχουμε περισσότερα από ένα Μπορούμε επίσης να έχουμε περισσότερα από ένα τμήματα προλόγου ανάμεσα στα οποία παρεμβάλλονται τμήματα προλόγου ανάμεσα στα οποία παρεμβάλλονται δηλώσεις του δηλώσεις του yacc.yacc.

%{#include <stdio.h>#include “def.h”void print_token_value (FILE *, int, YYSTYPE); extern int lineno;

%}

HY340, 2012 Slide 5 / 43Α. Σαββίδης

Page 6: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc

Σε αυτό το τμήμα δηλώνονται τα σύμβολα της Σε αυτό το τμήμα δηλώνονται τα σύμβολα της γραμματική καθώς και κάποια χαρακτηριστικά γραμματική καθώς και κάποια χαρακτηριστικά τουςτους Δήλωση τερματικών και μη τερματικών συμβόλωνΔήλωση τερματικών και μη τερματικών συμβόλων Δήλωση αρχικού συμβόλουΔήλωση αρχικού συμβόλου Καθορισμός προτεραιότηταςΚαθορισμός προτεραιότητας

Επίσης δηλώνονται κάποιες παράμετροι που Επίσης δηλώνονται κάποιες παράμετροι που επηρεάζουν το συντακτικό αναλυτήεπηρεάζουν το συντακτικό αναλυτή Κυρίως σε σχέση με τα ονόματα των παραγόμενων Κυρίως σε σχέση με τα ονόματα των παραγόμενων

αρχείων του συντακτικού αναλυτή και των αρχείων του συντακτικού αναλυτή και των συναρτήσεων που προσφέρεισυναρτήσεων που προσφέρει

HY340, 2012 Slide 6 / 43Α. Σαββίδης

Page 7: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc - Γραμματική (1/3) - Γραμματική (1/3)

%%token token ΤΟΚΕΝ – ΤΟΚΕΝ – Ορίζει το τερματικό σύμβολο Ορίζει το τερματικό σύμβολο ΤΟΚΕΝΤΟΚΕΝ %%union union – – Ορίζει ένα Ορίζει ένα union union με τους τύπους που μπορούν με τους τύπους που μπορούν

να πάρουν τα σύμβολα (τερματικά και μη)να πάρουν τα σύμβολα (τερματικά και μη) Π.χ. το Π.χ. το %union { int intVal; char * strVal; symrec *tptr; }%union { int intVal; char * strVal; symrec *tptr; }

δηλώνει ότι τα σύμβολα μπορούν να έχουν τύπο δηλώνει ότι τα σύμβολα μπορούν να έχουν τύπο int, char * int, char * ή ή symrecsymrec

Τα ονόματα που δίνονται (Τα ονόματα που δίνονται (intVal, strVal, tptr) intVal, strVal, tptr) είναι για να είναι για να μπορούμε να αναφερθούμε στους τύπουςμπορούμε να αναφερθούμε στους τύπους

%%token token <<intVal> intVal> ΤΟΚΕΝ – ΤΟΚΕΝ – Ορίζει το τερματικό σύμβολο Ορίζει το τερματικό σύμβολο ΤΟΚΕΝΤΟΚΕΝ, με τύπο αυτό που αντιστοιχεί στο , με τύπο αυτό που αντιστοιχεί στο intValintVal πεδίο πεδίο του του union.union.

%%type <intVal> exprtype <intVal> expr – – Ορίζει το μη τερματικό σύμβολο Ορίζει το μη τερματικό σύμβολο exprexpr με τύπο αυτό που αντιστοιχεί στο με τύπο αυτό που αντιστοιχεί στο intValintVal πεδίο του πεδίο του union. union.

HY340, 2012 Slide 7 / 43Α. Σαββίδης

Page 8: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc - Γραμματική (2/3) - Γραμματική (2/3)

%%start symbol start symbol – – Ορίζει το αρχικό σύμβολο της Ορίζει το αρχικό σύμβολο της γραμματικήςγραμματικής Αν παραληφθεί, αρχικό σύμβολο θεωρείται το πρώτο μη Αν παραληφθεί, αρχικό σύμβολο θεωρείται το πρώτο μη

τερματικό σύμβολο που εμφανίζεται στο τμήμα της περιγραφής τερματικό σύμβολο που εμφανίζεται στο τμήμα της περιγραφής της γραμματικήςτης γραμματικής

%destructor { code } symbols%destructor { code } symbols – – Ορίζει ένα τμήμα Ορίζει ένα τμήμα κώδικα που εκτελείται για τα δοθέντα σύμβολα όταν αυτά κώδικα που εκτελείται για τα δοθέντα σύμβολα όταν αυτά σταματήσουν να χρησιμοποιούνταισταματήσουν να χρησιμοποιούνται Προσφέρεται από το Προσφέρεται από το bison bison αλλά όχι από το αλλά όχι από το yaccyacc Πολύ χρήσιμο για αποδέσμευση μνήμης σε περιπτώσεις λάθους Πολύ χρήσιμο για αποδέσμευση μνήμης σε περιπτώσεις λάθους %union { char *string; }%union { char *string; }

%token <string> STRING%token <string> STRING%destructor { free ($$); } STRING%destructor { free ($$); } STRING

%%expect n expect n – – Δηλώνει ότι αναμένουμε η γραμματική μας Δηλώνει ότι αναμένουμε η γραμματική μας να έχει να έχει nn conflicts conflicts Ελέγχουμε πάντα όμως ότι ο Ελέγχουμε πάντα όμως ότι ο yaccyacc παίρνει τη σωστή απόφαση παίρνει τη σωστή απόφαση

HY340, 2012 Slide 8 / 43Α. Σαββίδης

Page 9: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc - Γραμματική ( - Γραμματική (33/3)/3)

ΠροτεραιότητεςΠροτεραιότητες %%left, left, %%right, right, %%nonassocnonassoc Ορίζουν την προτεραιότητα στα Ορίζουν την προτεραιότητα στα token token που ακολουθούν και που ακολουθούν και

βρίσκονται στην ίδια γραμμή, π.χ. βρίσκονται στην ίδια γραμμή, π.χ. %left ADD SUB%left ADD SUB Ίδια προτεραιότητα στα σύμβολα της ίδιας γραμμήςΊδια προτεραιότητα στα σύμβολα της ίδιας γραμμής Αυξανόμενη προτεραιότητα από πάνω προς τα κάτω, π.χ.Αυξανόμενη προτεραιότητα από πάνω προς τα κάτω, π.χ.

%left ADD, SUB /* + -*/ %left MUL, DIV /* * / */ %right EXP /* ^ */

%nonassoc EQ /* == */ Το Το leftleft σημαίνει ότι έχουμε αριστερή προσεταιριστικότητασημαίνει ότι έχουμε αριστερή προσεταιριστικότητα

Το 1+2+3 σημαίνει (1+2) + 3Το 1+2+3 σημαίνει (1+2) + 3 Το Το rightright σημαίνει ότι έχουμε δεξιά προσεταιριστικότητασημαίνει ότι έχουμε δεξιά προσεταιριστικότητα

Το 2^2^3 σημαίνει 2^(2^3)Το 2^2^3 σημαίνει 2^(2^3) Το Το nonassoc nonassoc σημαίνει ότι δεν υπάρχει προσεταιριστικότητασημαίνει ότι δεν υπάρχει προσεταιριστικότητα

To 1 == 2 == 3 To 1 == 2 == 3 δεν επιτρέπεταιδεν επιτρέπεται Το 1+2*3^4^5-6 υπολογίζεται ως (1 + (2 * (3 ^ (4 ^ 5)))) - 6Το 1+2*3^4^5-6 υπολογίζεται ως (1 + (2 * (3 ^ (4 ^ 5)))) - 6

HY340, 2012 Slide 9 / 43Α. Σαββίδης

Page 10: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc – – Παράμετροι (1/2)Παράμετροι (1/2) %defines%defines

Παράγει ένα Παράγει ένα header file header file με τις δηλώσεις με τις δηλώσεις macrosmacros για τα για τα σύμβολα της γραμματικής, καθώς και κάποιες σύμβολα της γραμματικής, καθώς και κάποιες επιπλέον δηλώσειςεπιπλέον δηλώσεις

Αν το παραγόμενο αρχείο του συντακτικού αναλυτή Αν το παραγόμενο αρχείο του συντακτικού αναλυτή είναι το είναι το parser.cparser.c, , τότε το τότε το header file header file θα έχει όνομα θα έχει όνομα parser.hparser.h

%output=“file”%output=“file” Ορίζει το όνομα του παραγόμενου αρχείου που θα Ορίζει το όνομα του παραγόμενου αρχείου που θα

περιέχει τον κώδικα του συντακτικού αναλυτήπεριέχει τον κώδικα του συντακτικού αναλυτή %file-prefix=“%file-prefix=“prefixprefix""

Αλλάζει το πρόθεμα των αρχεία που παράγονται ώστε Αλλάζει το πρόθεμα των αρχεία που παράγονται ώστε να είναι σαν το αρχείο εισόδου να λεγόταν να είναι σαν το αρχείο εισόδου να λεγόταν prefix.yprefix.y

%%namename-prefix=“-prefix=“prefixprefix"" Αλλάζει το πρόθεμα των συμβόλων που χρησιμοποιεί Αλλάζει το πρόθεμα των συμβόλων που χρησιμοποιεί

ο συντακτικός αναλυτής σε ο συντακτικός αναλυτής σε “prefix”“prefix” αντί για αντί για “yy”“yy”

HY340, 2012 Slide 10 / 43Α. Σαββίδης

Page 11: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Δηλώσεις Δηλώσεις YaccYacc – – Παράμετροι (2/2)Παράμετροι (2/2)

%pure-parser%pure-parser Ο Ο παραγόμενος συντακτικός αναλυτής είναι παραγόμενος συντακτικός αναλυτής είναι reentrant reentrant

((μπορούμε να κάνουμε νέα κλήση στην μπορούμε να κάνουμε νέα κλήση στην yyparseyyparse πριν πριν τελειώσει η προηγούμενη)τελειώσει η προηγούμενη). . ΠροσοχήΠροσοχή στο πρωτότυπο στο πρωτότυπο που θα πρέπει να έχει η που θα πρέπει να έχει η yylexyylex..

%pars%parse-param {argument-declaration}e-param {argument-declaration} Προσθέτει μια παράμετρο στο πρωτότυπο της Προσθέτει μια παράμετρο στο πρωτότυπο της

συνάρτησης συνάρτησης yyparseyyparse %lex%lex-param {argument-declaration}-param {argument-declaration}

Προσθέτει μια παράμετρο στο πρωτότυπο της Προσθέτει μια παράμετρο στο πρωτότυπο της συνάρτησης συνάρτησης yylexyylex

%%error-verboseerror-verbose Χρησιμοποιείται για να πάρουμε πιο αναλυτικά Χρησιμοποιείται για να πάρουμε πιο αναλυτικά

μηνύματα λάθους στην κλήση της μηνύματα λάθους στην κλήση της yyerroryyerror

HY340, 2012 Slide 11 / 43Α. Σαββίδης

Page 12: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Περιγραφή γραμματικήςΠεριγραφή γραμματικής

Σε αυτό το τμήμα δίνεται η περιγραφή μιας Σε αυτό το τμήμα δίνεται η περιγραφή μιας context-free context-free γραμματικής μέσω γραμματικών κανόνωνγραμματικής μέσω γραμματικών κανόνων

Παράδειγμα:Παράδειγμα:

Επιτρέπεται και ο κενός κανόνας που κάνει Επιτρέπεται και ο κενός κανόνας που κάνει match match το κενό το κενό string, string, π.χ. π.χ. program: /*empty*/ | statements ;program: /*empty*/ | statements ;

expr: NUM| expr ‘+’

expr {}| expr ‘-’

expr {}| expr ‘*’

expr {}| expr ‘/’

expr {}| ‘(‘ expr ‘)’

{ /*…*/};

Μη τερματικάΜη τερματικάσύμβολασύμβολα

ΕναλλακτικοίΕναλλακτικοίκανόνεςκανόνες

Τέλος γραμματικούΤέλος γραμματικού κανόνακανόνα

ΤερματικάΤερματικάσύμβολασύμβολα

ActionsActions((κώδικας)κώδικας)

HY340, 2012 Slide 12 / 43Α. Σαββίδης

Page 13: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΕπίλογοςΕπίλογος

Σκοπός του είναι μόνο η εύκολη και άμεση προσθήκη Σκοπός του είναι μόνο η εύκολη και άμεση προσθήκη υλοποιήσεων των συναρτήσεων που χρησιμοποιούνται υλοποιήσεων των συναρτήσεων που χρησιμοποιούνται από τον παραγόμενο συντακτικό αναλυτήαπό τον παραγόμενο συντακτικό αναλυτή

Ότι προστίθεται σε αυτό το τμήμα αντιγράφεται χωρίς Ότι προστίθεται σε αυτό το τμήμα αντιγράφεται χωρίς αλλαγές στο τέλος του παραγόμενο αρχείο αλλαγές στο τέλος του παραγόμενο αρχείο .c .c που που περιέχει τον κώδικα του συντακτικού αναλυτήπεριέχει τον κώδικα του συντακτικού αναλυτή

Το τμήμα αυτό είναι προαιρετικό και όταν παραλειφθεί Το τμήμα αυτό είναι προαιρετικό και όταν παραλειφθεί μπορεί να παραλειφθεί και το δεύτερο σύμβολομπορεί να παραλειφθεί και το δεύτερο σύμβολο “%%” “%%”

%%

int main(int argc, char **argv) {yyparse();return 0;

}

HY340, 2012 Slide 13 / 43Α. Σαββίδης

Page 14: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Lex & YaccLex & Yacc

LexLex Κάνει Κάνει include include το το header file header file που παράγεται από το που παράγεται από το yaccyacc για να δει για να δει

τα τα tokens tokens και τους τύπους τουςκαι τους τύπους τους Μέσα στα Μέσα στα actions actions γράφουμε κώδικα που επιστρέφει στο γράφουμε κώδικα που επιστρέφει στο yaccyacc

ένα-ένα τα ένα-ένα τα tokens tokens που αναγνωρίστηκανπου αναγνωρίστηκαν Επίσης, φροντίζουμε να παρέχουμε τις τιμές για τα Επίσης, φροντίζουμε να παρέχουμε τις τιμές για τα tokenstokens που που

έχουν και κάποιο δηλωμένο τύποέχουν και κάποιο δηλωμένο τύπο Π.χ. για τον ακέραιο 5 θα πρέπει να δώσουμε στο Π.χ. για τον ακέραιο 5 θα πρέπει να δώσουμε στο yacc yacc το το token token

INTEGER, INTEGER, αλλά και να του παρέχουμε αριθμητική τιμή 5αλλά και να του παρέχουμε αριθμητική τιμή 5 YaccYacc

Στον πρόλογο δηλώνουμε τη συνάρτηση yylex που είναι Στον πρόλογο δηλώνουμε τη συνάρτηση yylex που είναι υπεύθυνη για την λεξικογραφική ανάλυση (και παρέχεται από το υπεύθυνη για την λεξικογραφική ανάλυση (και παρέχεται από το lex)lex)

Εφαρμόζουμε τους κανόνες της γραμματικής ανάλογα με τα Εφαρμόζουμε τους κανόνες της γραμματικής ανάλογα με τα tokens tokens που επιστρέφονται από την που επιστρέφονται από την yylexyylex

Στα Στα actions actions χρησιμοποιούμε και τις τιμές που έχουν τα χρησιμοποιούμε και τις τιμές που έχουν τα tokens tokens με με συγκεκριμένους τύπουςσυγκεκριμένους τύπους Π.χ. εκτελούμε τον κανόνα για τον ακέραιο και κατόπιν στο Π.χ. εκτελούμε τον κανόνα για τον ακέραιο και κατόπιν στο actionaction

παίρνουμε και την αριθμητική τιμή τουπαίρνουμε και την αριθμητική τιμή του

HY340, 2012 Slide 14 / 43Α. Σαββίδης

Page 15: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα (1/6)(1/6)

Γραμματική για έναν απλό υπολογιστή Γραμματική για έναν απλό υπολογιστή αριθμητικών εκφράσεωναριθμητικών εκφράσεωνΥποστηρίζουμε ανάθεση μίας αριθμητικής Υποστηρίζουμε ανάθεση μίας αριθμητικής

έκφρασης σε μία μεταβλητήέκφρασης σε μία μεταβλητήΥποστηρίζουμε αριθμητικές εκφράσεων που Υποστηρίζουμε αριθμητικές εκφράσεων που

χωρίζονται με χαρακτήρες τέλους γραμμήςχωρίζονται με χαρακτήρες τέλους γραμμής Λεξικογραφικός αναλυτήςΛεξικογραφικός αναλυτής

Σύμβολα +, -, *, /, (, ), =, Σύμβολα +, -, *, /, (, ), =, \n\n, ακέραιους, , ακέραιους, idsids Συντακτικός αναλυτήςΣυντακτικός αναλυτής

Αρχική λίστα με εκχωρήσεις σε μεταβλητέςΑρχική λίστα με εκχωρήσεις σε μεταβλητέςΛίστα εκφράσεων που περιέχουν μεταβλητές Λίστα εκφράσεων που περιέχουν μεταβλητές

και αριθμητικές εκφράσειςκαι αριθμητικές εκφράσεις

HY340, 2012 Slide 15 / 43Α. Σαββίδης

Page 16: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα - Lex - Lex (2/6)(2/6)

Tο header file parser.hδημιουργείται από τον yacc

Oι τιμές των συμβολικώνονομάτων INTEGER, IDείναι ορισμένες στοheader file parser.h

Μετατρέπει πολλαπλά\n σε ένα

HY340, 2012 Slide 16 / 43Α. Σαββίδης

Page 17: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα – – Πρόλογος Πρόλογος YaccYacc (3/6)(3/6)

Καλείται από τονyacc με ένα μήνυμαόταν “ανακαλύψει”

κάποιο λάθος

Αρχικό σύμβολο γραμματικής

Δήλωση των τερματικώνσυμβόλων που

χρησιμοποιούνται απότον yacc και τον flex

Ορισμός προτεραιοτήτων και προσεταιριστικότητας

HY340, 2012 Slide 17 / 43Α. Σαββίδης

Page 18: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα – – Γραμματική Γραμματική YaccYacc (4/6)(4/6)

ε κανόνας

Αλλαγή προτεραιότηταςκανόνα

Δημιουργία μη κενήςλίστας expressions

Δημιουργία λίσταςassignments που

μπορεί να είναι κενή

HY340, 2012 Slide 18 / 43Α. Σαββίδης

Page 19: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα – – Επίλογος Επίλογος YaccYacc (5/6)(5/6)

Παράγεται από τον yacc

Την παρέχουμεεμείς στο yacc

HY340, 2012 Slide 19 / 43Α. Σαββίδης

Page 20: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα – – Παραγωγή εκτελέσιμουΠαραγωγή εκτελέσιμου (6/7)(6/7)

parser.y

scanner.l scanner.c

parser.c

parser.h

calc

yacc/bison

lex/flex

Compiler

HY340, 2012 Slide 20 / 43Α. Σαββίδης

Page 21: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ΠαράδειγμαΠαράδειγμα – – Test programs Test programs (7/7)(7/7)

Έγκυρο πρόγραμμα Μη έγκυρα προγράμματα

Δήλωση μετάαπό εκφράσεις

\n στις δηλώσεις

HY340, 2012 Slide 21 / 43Α. Σαββίδης

Page 22: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Ασάφειες στη γραμματική (1/3)Ασάφειες στη γραμματική (1/3)

Η περιγραφή μιας γραμματικής μπορεί να Η περιγραφή μιας γραμματικής μπορεί να παράγει μία συγκεκριμένη ακολουθία συμβόλων παράγει μία συγκεκριμένη ακολουθία συμβόλων με δύο ή περισσότερους τρόπουςμε δύο ή περισσότερους τρόπους

Π.χ. με αυτή τη γραμματική, η έκφραση 1+2*3 Π.χ. με αυτή τη γραμματική, η έκφραση 1+2*3 μπορεί να παραχθεί ως:μπορεί να παραχθεί ως:

exprexpr expr '+' expr expr '+' expr expr '+' expr '*' expr expr '+' expr '*' expr NUMBER '+' NUMBER '*' NUMBER NUMBER '+' NUMBER '*' NUMBER 1+2*3 1+2*3

exprexpr expr '*' expr expr '*' expr expr '+' expr '*' expr expr '+' expr '*' expr NUMBER '+' NUMBER '*' NUMBER NUMBER '+' NUMBER '*' NUMBER 1+2*3 1+2*3

expr : expr '+' expr | expr '*'

expr | NUMBER ;

HY340, 2012 Slide 22 / 43Α. Σαββίδης

Page 23: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Ασάφειες στη γραμματική (2/3)Ασάφειες στη γραμματική (2/3)

1+2*3 (1+2) * 3

expr

+expr

NUMBER

1

expr

expr * expr

NUMBER NUMBER

2 3

Η ασάφεια αυτή φαίνεται καλύτερα στα Η ασάφεια αυτή φαίνεται καλύτερα στα συντακτικά δέντρα (συντακτικά δέντρα (syntax trees)syntax trees)

Το προηγούμενο παράδειγμα δίνει τα παρακάτω Το προηγούμενο παράδειγμα δίνει τα παρακάτω συντακτικά δέντρασυντακτικά δέντρα

1+2*3 1+ (2 * 3)

expr

expr * expr

expr + expr

NUMBER NUMBER

NUMBER

1 2

3

HY340, 2012 Slide 23 / 43Α. Σαββίδης

Page 24: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Ασάφειες στη γραμματική (2/3)Ασάφειες στη γραμματική (2/3)

Αυτή η αμφισημία στις γραμματικές δεν Αυτή η αμφισημία στις γραμματικές δεν είναι επιθυμητή επειδή μπορούμε να είναι επιθυμητή επειδή μπορούμε να καταλήξουμε σε λάθος συμπεράσματακαταλήξουμε σε λάθος συμπεράσματα

Απαλοιφή ασάφειαςΑπαλοιφή ασάφειαςΜε προτεραιοτήτων τελεστώνΜε προτεραιοτήτων τελεστώνΜε αλλαγή της γραμματικήςΜε αλλαγή της γραμματικής

Στο προηγούμενο παράδειγμα ας πούμε έχουμε:Στο προηγούμενο παράδειγμα ας πούμε έχουμε:expr : expr '+' expr1

| expr1;

expr1: expr1 '*' NUMBER | NUMBER;

exprexpr expr '+' expr1 expr '+' expr1 expr1 '+' expr1 expr1 '+' expr1 expr1 '+' expr1 '*' NUMBER expr1 '+' expr1 '*' NUMBER expr1 '+' NUMBER '*' NUMBER expr1 '+' NUMBER '*' NUMBER NUMBER '+' NUMBER '*' NUMBER NUMBER '+' NUMBER '*' NUMBER 1+2*3 1+2*3

HY340, 2012 Slide 24 / 43Α. Σαββίδης

Page 25: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Πως δουλεύει ο Yacc (1/5)

Το parsing μίας ακολουθίας εισόδου γίνεται στην πραγματικότητα από κάτω προς τα πάνω (bottom-up parsing) π.χ η έκφραση 3*4*(3+2) ανάγεται σε expr ως εξής:

3*4*(3+2) NUMBER '*' 4 '*' '(' 3 '+' 2 ')‘ expr '*' 4 '*' '(' 3 '+' 2 ')‘ expr '*' NUMBER '*' '(' 3 '+' 2 ')‘ expr '*' expr '*' '(' 3 '+' 2 ')‘

expr '*' '(' 3 '+' 2 ')‘ expr '*' '(' NUMBER '+' 2 ')‘ expr '*' '(' expr '+' 2 ')‘

expr '*' '(' expr '+' NUMBER ')‘ expr '*' '(' expr '+' expr ')‘ expr '*' '(' expr ')‘ expr '*' expr expr

expr : expr '+' expr | expr '*'

expr | '(' expr

')' | NUMBER ;

HY340, 2012 Slide 25 / 43Α. Σαββίδης

Page 26: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Πως δουλεύει ο Yacc (2/5)

Για την υλοποίηση μίας “από κάτω προς τα πάνω” συντακτικής ανάλυσης θα χρησιμοποιήσουμεΜία στοίβα στην οποία θα αποθηκεύονται τα

σύμβολα που αποτελούν τη γλώσσαΜία ενέργεια “shift” η οποία θα τοποθετεί ένα

σύμβολο από την είσοδο στη στοίβαΜία ενέργεια “reduce” η οποία θα αντικαθιστά

ένα σύμβολο ή μία ακολουθία συμβόλων που εμφανίζονται στο δεξιό μέρος ενός κανόνα με το σύμβολο που εμφανίζεται στο αριστερό μέρος του κανόνα

HY340, 2012 Slide 26 / 43Α. Σαββίδης

Page 27: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Πως δουλεύει ο Yacc (3/5)

Μία ενέργεια “accept” που εφαρμόζεται όταν διαβαστεί ολόκληρη η είσοδος και έχει αναγνωριστεί το αρχικό σύμβολο

Σηματοδοτεί την εγκυρότητα της ακολουθίας εισόδου σύμφωνα με την γραμματική

Μία ενέργεια “error” που εφαρμόζεται όταν δεν μπορεί να εφαρμοστεί καμία ενέργεια “reduce” πάνω στη στοίβα, δηλαδή τα σύμβολα που υπάρχουν σε αυτήν δεν υπάρχουν στο δεξί μέρος κανενός κανόνα

Σηματοδοτεί την αδυναμία της γραμματικής να περιγράψει την ακολουθία εισόδου

HY340, 2012 Slide 27 / 43Α. Σαββίδης

Page 28: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Πως δουλεύει ο Yacc (4/5)

Έτσι ο αλγόριθμος που εφαρμόζεται για την συντακτική ανάλυση της ακολουθίας εισόδου, είναι ο εξήςΑνάλογα με την κατάσταση στην οποία

βρίσκεται, ο συντακτικός αναλυτής, αποφασίζει εάν χρειάζεται το επόμενο σύμβολο από την είσοδο (lookahead token) για να επιλέξει την επόμενη ενέργεια

Ανάλογα με την τρέχουσα κατάσταση και το επόμενο σύμβολο (εάν χρειάζεται) αποφασίζει να εκτελέσει μία από τις ενέργειες “shift”, “reduce”, “accept” ή “error”

HY340, 2012 Slide 28 / 43Α. Σαββίδης

Page 29: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Πως δουλεύει ο Yacc (5/5)

ΠαραδείγματαΣτοίβα Είσοδος Ενέργεια

3*4*(3+2) shift3 *4*(3+2) reduceexpr *4*(3+2) shiftexpr * 4*(3+2) shiftexpr * 4 *(3+2) reduceexpr * expr *(3+2) reduceexpr *(3+2) shiftexpr * (3+2) shiftexpr * ( 3+2) shiftexpr * ( 3 +2) reduceexpr * ( expr +2) shiftexpr * ( expr + 2) shiftexpr * ( expr + 2 ) reduceexpr * ( expr + expr ) reduceexpr * ( expr ) shiftexpr * ( expr ) reduceexpr * epxr reduceexpr accept

expr : expr '+' expr | expr '*' expr | '(' expr ')' | NUMBER ;

Στοίβα Είσοδος Ενέργεια3**4*(3+2) shift

3 **4*(3+2) reduceexpr **4*(3+2) shiftexpr * *4*(3+2) shiftexpr * * 4*(3+2) error

Ανεπιτυχής συντακτική ανάλυση

Επιτυχής συντακτική ανάλυση

HY340, 2012 Slide 29 / 43Α. Σαββίδης

Page 30: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Yacc Conflicts (1/4)Yacc Conflicts (1/4)

Συμπεριφορά του yacc όταν για μία Συμπεριφορά του yacc όταν για μία παραγωγή υπάρχουν δύο ή περισσότεροι παραγωγή υπάρχουν δύο ή περισσότεροι “δρόμοι”“δρόμοι”Ουσιαστικά όταν υπάρχουν δύο ή παραπάνω Ουσιαστικά όταν υπάρχουν δύο ή παραπάνω

διαφορετικές παραγωγές για μία ακολουθία διαφορετικές παραγωγές για μία ακολουθία εισόδου, ο yacc σε κάποιο σημείο θα βρεθεί εισόδου, ο yacc σε κάποιο σημείο θα βρεθεί στο δίλημμα να κάνει “reduce” με τον στο δίλημμα να κάνει “reduce” με τον κατάλληλο κανόνα ή να κάνει “shift” και να κατάλληλο κανόνα ή να κάνει “shift” και να κάνει “reduce” με έναν επόμενο κανόνα (ο κάνει “reduce” με έναν επόμενο κανόνα (ο οποίος περιέχει και όλα τα σύμβολα του οποίος περιέχει και όλα τα σύμβολα του πρώτου κανόνα)πρώτου κανόνα)

Το δίλημμα αυτό λέγεται Το δίλημμα αυτό λέγεται shift/reduce conflictshift/reduce conflict

HY340, 2012 Slide 30 / 43Α. Σαββίδης

Page 31: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Yacc Conflicts (2/4)Yacc Conflicts (2/4)

Παράδειγμα

Στοίβα Είσοδος ΕνέργειαIF (4) IF (5) 5 ELSE 6 shift

IF (4) IF (5) 5 ELSE 6 shiftIF ( 4) IF (5) 5 ELSE 6 shiftIF ( 4 ) IF (5) 5 ELSE 6 shiftIF ( 4 ) IF (5) 5 ELSE 6 shift... ... shift ...IF ( 4 ) IF (5) 5 ELSE 6 shift ή reduce

expr : ifelse | NUMBER ;

ifelse: IF '(' NUMBER ')' expr else;

else : ELSE expr | /* empty */ ;

HY340, 2012 Slide 31 / 43Α. Σαββίδης

Page 32: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Yacc Conflicts (3/4)Yacc Conflicts (3/4)

Μπορεί να έχουμε και δύο διαφορετικούς κανόνες με ίδιο δεξιό μέρος

Στην περίπτωση αυτή, όταν ο yacc αναγνωρίσει την ακολουθία συμβόλων που περιγράφεται από αυτό, δε θα ξέρει ποιο κανόνα να χρησιμοποιήσει για να κάνει “reduce”

Το δίλημμα αυτό λέγεται reduce/reduce conflict

HY340, 2012 Slide 32 / 43Α. Σαββίδης

Page 33: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Yacc Conflicts (4/4)Yacc Conflicts (4/4)

Ο yacc παράγει συντακτικούς αναλυτές, ακόμα κι αν η γραμματική περιέχει shift/reduce ή reduce/reduce conflicts Κατά τη διάρκεια shift/reduce conflict ο yacc κάνει εξ' ορισμού

“shift” Κατά τη διάρκεια reduce/reduce conflict ο yacc κάνει “reduce”

με τον κανόνα που βρίσκεται πιο κοντά στην αρχή του αρχείου “.y”

Εάν τρέξουμε τον yacc (ή bison) με την παράμετρο “-v”, ο τελευταίος δημιουργεί ένα αρχείο με κατάληξη “.output” στο οποίο επισημαίνει τα σημεία των κανόνων που οδηγούν σε conflicts Στους κανόνες με τα conflicts θα δείτε κάποιες τελείες, που

αντιστοιχούν στην ακριβή θέση του conflict μέσα στον κανόνα

HY340, 2012 Slide 33 / 43Α. Σαββίδης

Page 34: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Actions (1/5)

Μπορούμε να παρεμβάλλουμε ανάμεσα στα σύμβολα των δεξιών μερών των κανόνων κάποια actions, δηλαδή c, c++ κώδικα μέσα σε { }Εκτελούνται κάθε φορά που ενεργοποιείται η

συγκεκριμένη παραγωγήΠαράδειγμα

expr : ID { printf(“Found ID\n”); } | expr '+' { int a = 3; } expr { int

b; } | /* empty */ { printf(“empty\n”); } ;

HY340, 2012 Slide 34 / 43Α. Σαββίδης

Page 35: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Actions (2/5)

Μπορούμε μέσα από τα actions να αναφερθούμε σε όλα τα σύμβολα που έχουν δηλωμένο τύπο Στο αριστερό μέρος ενός κανόνα αντιστοιχεί το σύμβολο $$ Κάθε δεξιό σύμβολο ενός κανόνα, μπορεί να αναφερθεί μέσω του

συμβολικού ονόματος $N (N = 1, 2, ...) ανάλογα με την σχετική του θέση

Προσοχή, καθώς στην αρίθμηση μετράνε και τα ίδια τα actions

non_terminal: FOO { g_var = $1; } BAR { g_var2 = $3; }$1 $2 $3 $4$$

HY340, 2012 Slide 35 / 43Α. Σαββίδης

Page 36: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Actions (3/5)

Οι τιμές στα τερματικά σύμβολα δίνονται από τον λεξικογραφικό αναλυτήΟ yacc δηλώνει μία καθολική μεταβλητή, στιγμιότυπο

του “union” που έχουμε ορίσει, με το όνομα yylvalΚάθε φορά που αναγνωρίζουμε ένα σύμβολο στον

lex/flex, πριν επιστρέψουμε τον “κωδικό” του, αποθηκεύουμε στο “union” και την τιμή του (αν έχει)

%union {char* stringValue;int intValue;double realValue;

}

HY340, 2012 Slide 36 / 43Α. Σαββίδης

Page 37: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Actions (4/5)

Παράδειγμα με actions (lex)

HY340, 2012 Slide 37 / 43Α. Σαββίδης

Page 38: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Actions (5/5)

Παράδειγμα με actions (yacc)

HY340, 2012 Slide 38 / 43Α. Σαββίδης

Page 39: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Error handling (1/4)Error handling (1/4)

Ο yacc εξ' ορισμού, όταν δεν μπορεί να αναγνωρίσει την ακολουθία συμβόλων εισόδου, καλεί την συνάρτηση yyerror και τερματίζει την λειτουργία του

Πολλές φορές δε θέλουμε να τερματίζουμε τη λειτουργία του προγράμματος μας στο πρώτο συντακτικό λάθοςΕιδικά σε “interactive” προγράμματα όπως το

“bc” του UNIX

HY340, 2012 Slide 39 / 43Α. Σαββίδης

Page 40: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Error handling (2/4)Error handling (2/4)

Η επαναφορά της λειτουργίας του συντακτικού αναλυτή μετά από συντακτικό λάθος (error recovery) είναι πολύ δύσκολη διαδικασία, επειδή πρέπει να “μαντέψουμε” που τελειώνει το κομμάτι που δεν συμφωνεί με την γραμματική ... και που ξεκινάει το κομμάτι που είναι εν δυνάμει σωστόΟ yacc προσφέρει ένα σύμβολο με το όνομα error το

οποίο καταναλώνει τα περιεχόμενα της στοίβας και τα επόμενα σύμβολα εισόδου, μέχρι να ανακαλύψει τουλάχιστον τρία σύμβολα που ξεκινούν ένα άλλο κανόνα

n_term: FOO |

error ;

HY340, 2012 Slide 40 / 43Α. Σαββίδης

Page 41: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Error handling (3/4)Error handling (3/4)

Μπορούμε επίσης να κατευθύνουμε την διαδικασία επαναφοράς προσθέτοντας σύμβολα στην παραγωγή που περιέχει το σύμβολο error και προσθέτοντας actions

ΠαράδειγμαΌταν συμβεί λάθος ο συντακτικός αναλυτής αγνοεί

όλα τα σύμβολα μέχρι να συναντήσει ';‘

HY340, 2012 Slide 41 / 43Α. Σαββίδης

Page 42: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

Error handling (4/4)Error handling (4/4)

Ο yacc προσφέρει τα εξής macros που μπορούν να χρησιμοποιηθούν σε κανόνεςyyerrok – εξαναγκάζει τον συντακτικό αναλυτή

να θεωρήσει ότι βγήκε από την κατάσταση επαναφοράς μετά από λάθος και έτσι να αρχίσει κατευθείαν να ειδοποιεί για καινούρια λάθη

yyclearin – καθαρίζει το lookahead

HY340, 2012 Slide 42 / 43Α. Σαββίδης

Page 43: HY 340  : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ

ReferencesReferences

Bison Home PageBison Home Pagehttp://www.gnu.org/software/bison

Bison ManualBison Manualhttp://www.gnu.org/software/bison/manual/html

_mono/bison.html Bison for WindowsBison for Windows

http://gnuwin32.sourceforge.net/packages/bison.htm

HY340, 2012 Slide 43 / 43Α. Σαββίδης