0% au considerat acest document util (0 voturi)
6 vizualizări6 pagini

TP3 - Analizor Sintactic (Unealtă Bison) : Partea I - Rappel (Bizon)

Acest document descrie utilizarea instrumentului Bison pentru a genera un analizor sintactic. Acesta prezintă diferitele părți ale unui fișier de specificații Bison, precum și un exemplu care ilustrează coordonarea între Flex și Bison. Documentul conține, de asemenea, exerciții privind scrierea unui analizor care recunoaște instrucțiuni matematice.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
6 vizualizări6 pagini

TP3 - Analizor Sintactic (Unealtă Bison) : Partea I - Rappel (Bizon)

Acest document descrie utilizarea instrumentului Bison pentru a genera un analizor sintactic. Acesta prezintă diferitele părți ale unui fișier de specificații Bison, precum și un exemplu care ilustrează coordonarea între Flex și Bison. Documentul conține, de asemenea, exerciții privind scrierea unui analizor care recunoaște instrucțiuni matematice.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Universitatea Tunis El Manar

Institutul Superior de Informatică

MODUL: Tehnici de Compilare DEPARTAMENTGLSI


ÎNDATORIRILE CURSULUI: Dna Haouari NIVELL2SIL
CHELTUIELI DP: MRFOUEDOUESLATI A.U. :2018–2019

TP3 - Analizor sintactic


(Unealtă Bison)

Partea I - Rappel (Bizon)


Rolul analizorului sintactic este de a verifica sintaxa programului sursă. Acesta primeș te o
suita de unităț i lexicale furnizată de analizadorul lexical ș i trebuie să verifice că această suită poate fi
generată de gramatica limbajului.

Bison (versiunea GNU de YACC) este un generator de analizatori sintactici. Acceptă în


introduce descrierea unei limbi sub forma unei gramatici ș i produce un program scris
în C care, odată compilat, recunoaș te cuvintele (programele) aparț inând limbajului generat
prin gramatică la intrare.

Un fiș ier de specificaț ii Bison se compune din patru părț i:


%{
Declaraț iile în c
%}
Declaraț ia unităț ilor lexicale utilizate
Declaraț ie de priorităț i ș i de tipuri
%%
Reguli de producț ie cu eventuale acț iuni semantice
%%
Bloc principal ș i funcț ii auxiliare în C

Reguli de producț ie :
Non-terminal:prod1
|prod2
prod3
….
prodn
;
Simbolurile terminale sunt :
-Unită ț i lexicale (pe care trebuie să le declarăm obligatoriu în partea 2)
Sintaxă : %token nume-unitate-lexicală
Exemple : %tokenNB
%tokenID
- Des caractere între ghilimele: ‘+’, ‘a’…
1
- Ș iruri de caractere între ghilimele: "while"

Simbolurile non-terminal reprezintă orice succesiune de litere mari ș i/sau mici.

Observaț ie: ParteaBloc principal ș i funcț ii auxiliare trebuie să conț ină o funcț ieyylex()
efectuând analiza lexică a programului sursă. Putem fie să scriem direct aceasta
funcț ia să fie utilizată funcț ia produsă de Flex.

Partea II – Instalarea mediului ș i teste


1. Deschideț i un nou fiș ier text ș i tastaț i codul de mai sus. Fiș ierul trebuie salvat.
cu extensia .y (de exemplu grammaire.y).
2. Aș ezaț i fiș ierul obț inut în ‘C:\Program Files\GnuWin32\bin ’
3. Din linia de comandă, lansaț i comanda:
Yacc -dgrammaire.y
4. În caz de succes, fiș [Link] generat în acelaș i director.
5. Compilaț i fiș ierul gramatică.[Link] a genera executabilul.
gcc [Link].c -o prog
6. Care sunt cuvintele acceptate?

%{
#include <stdio.h>
int yylex(void);
int yyerror (char*);
%}
%%
mot : S '$' {printf("mot corect"); getchar();}
;
'a'S'a'
'b'S'b'
'c'
;
%%
int yylex()
{
char c=getchar();
dacă (c=='a'||c=='b'||c=='c'||c=='$') return(c);
altfel printf("eroare lexicială");
}
int yyerror(char *s){
printf("%s \n",s);
return 0;
}
int main(){
yyparse();
return 0;}printf("\n");
return 0;
}

Coordonare între Flex ș i Bison


Se poate utiliza funcț ia yylex() generată de Flex pentru a efectua analiza lexicală.
Observaț ie: Un atribut este asociat fiecărui simbol al gramaticii (terminal sau nu).
Atributul unei unită ț i lexicale este valoarea con ț inută în variabila globală predefinită

2
yylval. Această variabilă este instrumentul de bază de comunicare între Flex ș i Bison pe parcursul
analiza. Aș adar, trebuie să ne gândim să atribuim corect analiza lexicală.
Exemple:
%%
[0-9]+ {yylval=atoi(yytext); return NB ;}
%%

- În mod implicit, yylval este de tip întreg. Îi putem schimba tipul prin declaraț ia în
parte 2 a unei uniuni. Exemplu :
% uniune {
int intreg;
roată dublă;
char * ș ir ;
}yylval ;

În acest caz, putem stoca valori întregi, reale sau ș iruri de caractere.
caractere. Trebuie să tipizăm unităț ile lexicale ș i simbolurile neterminale pe care le folosim
atributul, adică exemplul:
% token <entier> NB
% token <secvenț ă> ID
% tip <entier> S
% tip <chaine> Expr

- Pentru simbolurile neterminale, $$ desemnează valoarea atributului asociat neterminalului


de la partea stângă. $id desemnează valoarea asociată simbolului non-terminal i din partea
dreapta, de exemplu :
Expr : Expr‘+’ Expr {temp=$1 + $3 ;} ‘*’ Expr {$$=temp + $6 ;} ;

- Atributele pot fi utilizate în acț iunile semantice.

Generaț ia de analizor sintactic folosind Flex ș i Bison este ilustrată de


figura de mai jos :

Partea III–Exerciț ii
Vrem să scriem cu ajutorul Flex ș i Bison un analizor sintactic care să permită recunoaș terea
instrucț iuni de forma următoare:
1, 2, 3.

Este vorba despre o listă de întregi separate prin virgule, terminându-se cu un punct ș i precedate
fie prin cuvântul sumă fie prin cuvântul produs.

3
1. Mai întâi, scrie ț i următorul fi ș ier de specifica ț ii Bison:
%{

#include<stdio.h>

int yylex(void);

int yyerror(char *s);

%}

%token FIN SOM PROD NB

%%

liste: FIN {printf("corect");}

| SOM liste som '.' listă

| PROD listeprod '.' liste

listesom: NB

| listesom ',' NB

NB

| listeprod ',' NB

%%

int yyerror(char *s)

printf ("%s", s);

return (0);

int main()

yyparse();

return 0;

4
2. Compila ț i fi ș ierele folosind op ț iunea –d, de exemplu bison -d nume.y
3. În caz de succes, fi ș ierele [Link] [Link] sunt generate în acela ș i
repertoriu.
4. Include fi ș ierul [Link].h în fi ș ierul de specifica ț ii Flex (acest fi ș ier con ț ine
descrierea unităț ilor lexicale utilizate).
5. Deschide ț i un nou fi ș ier text ș i introduce ț i următorul cod de specifica ț ii Flex:

%{
#include<stdio.h>
#include<math.h>
#include"[Link].h"
%}
%opț iune fără yywrap
%%
[0-9]+ {yylval=atoi(yytext); return NB;}
produs
{return SOM;}
[,|.] {return yytext[0];}
[$] {return FIN;}
[ ] {}
. {printf("Eroare");}
%%
6. Compila ț i acest fi ș ier cu Flex pentru a genera fi ș ierul [Link].c.
7. Include ț i fi ș ierul [Link].c în fi ș ierul de specifica ț ii Bison.
8. Compila ț i acum fi ș ierul [Link].c pentru a ob ț ine executabilul.
gcc [Link].c [Link].c -o prog
9. Testa ț i fi ș ierul .exe ob ț inut pentru a verifica dacă func ț ionează corect.
[Link]ă exerciț iul precedent pentru ca executabilul să afiseze suma (respectiv
produsul) al numerelor întregi care formează fiecare ș ir.

Exemple : Dacă introducerea este :sume 2,5. Produs 3,6.$


Rezultatul va fi: Sumă = 7
18

Anexe :
Variabile :
YYLVAL : variabilă predefinită care conț ine valoarea unităț ii lexicale recunoscute.
YYACCEPT: instrucț iune care permite oprirea analizorului sintactic. În acest
cas, yyparse returnează valoarea 0 indicând succesul.
YYABORT: instruc ț iune care permite de asemenea oprirea analizorului. yyparse
întoarce atunci1, ceea ce poate fi folosit pentru a semnala eș ecul analizei.
% ÎNCEPUT non-terminal : aceasta este o ac ț iune pentru a spune că non-terminalul este
axioma.

[Link] :
int yyparse () : funcț ia principală care lansează analizorul sintactic.

5
int yyerror(char *s) : funcț ie apelată de fiecare dată când analizorul se confruntă cu
o eroare.

Bibliografie[Link]

S-ar putea să vă placă și