Documente Academic
Documente Profesional
Documente Cultură
Gh. Grigoras 1
Compilare - Interpretare
Programul surs secven de caractere
Analiza
lexical
Analiza
sintactic
Arborele sintactic
Analiza
semantic
Cod
intermediar
Compilare: Interpretare:
cod main Execuia
(asamblare) codului
Gh. Grigoras 2
Implementarea limbajelor - istorie
1957 Fortran: primul compilator (expresii aritmetice,
instruciuni, proceduri)
1960 Algol: prima utilizare a definiiilor formale
(gramatici, BNF, structura de bloc, recursie)
1970 Pascal: tipuri utilizator, maini virtuale (P-code)
1972 C: variabilele dinamice, multitasking,
gestionarea ntreruperilor
1983 ADA: primul limbaj standardizat
1985 C++: orientare-obiect, excepii, template-uri
1995 Java: just-in-time compilation
2000 C#: Tehnologia .NET
Gh. Grigoras 3
Proiectarea unui analizor lexical
Definiia 1 Fie un alfabet (al unui limbaj de
programare). O descriere lexical peste este o
expresie regulat E = (E1 | E2 || En)+, unde n este
numrul unitilor lexicale, iar Ei descrie o unitate
lexical, 1 i n.
Gh. Grigoras 5
Definiia 3 Fie E o descriere lexical peste i w L(E). O
interpretare a cuvntului w, (u1, k1)(u2, k2), (um, km), este
interpretare drept - orientat dac (i) 1 i m, are loc:
|ui| = max{|v| /v L(E1 | E2 || En) Pref(uiui+1um)}.
(unde Pref(w) este mulimea prefixelor cuvntului w ).
Gh. Grigoras 6
Definiia 4 O descriere lexical E este bine - format
dac orice cuvnt w din limbajul L(E) are exact o
interpretare drept-orientat.
Gh. Grigoras 8
Exemplul S considerm descrierea lexical:
litera a | b ||z
cifra 0 | 1 || 9
identificator litera (litera | cifra)*
semn + | -
numar (semn | ) cifra+
operator + | - | * | / | < | > | <= | >= | < >
asignare :=
doua_puncte :
cuvinte_rezervate if | then |else
paranteze ) | (
Gh. Grigoras 9
Ai
An
Ao
q0 Aa
Ad
Ac
Ap
Gh. Grigoras 10
litera, cifra
litera 1 #i sau #c
cifra
cifra #n
2
cifra
+, - #o
3
operator-{+,-} #o
4
: #a
5 = 6
#d
), ( #p
7
Gh. Grigoras 11
Implementare
buffer zona de memorie unde se ncarc o unitate lexical,
getnext(), store(c)
c = getnext(); empty(); stare = 0;
while(1){
switch(stare){
case 0:
if(isspace(c)){
c = getnext(); stare = 0;
}
if(isalpha(c)){
store(c); c = getnext(); stare = 1;
}
else if(isdigit(c)){
store(c); c = getnext(); stare = 2;
}
else if(c == '+' || c == '-'){
store(c); c = getnext(); stare = 3;
}
Gh. Grigoras 12
Lex (Flex)
Bell Laboratories 1975 M.E. Lesk i E. Schmidt
instrument standard UNIX ncepnd cu versiunea a 7-a
Proiectul GNU al Fundaiei Free Software distribuie FLEX
(Fast LEXical Analyzer Generator)
Gh. Grigoras 13
1. Scrierea specificaiilor LEX care reprezint
descrierea lexical (fiier cu extensia .l)
Gh. Grigoras 15
Metacaractere
. Orice caracter cu excepia newlin
\n newline
* zero sau mai multe copii ale expresiei precedente
Gh. Grigoras 16
Exemple de expresii
Expresia Candidai ce se potrivesc
abc abc
abc* ab abc abcc abccc ...
abc+ abc abcc abccc ...
a(bc)+ abc abcbc abcbcbc ...
a(bc)? a abc
[abc] unul dintre caracterele: a, b, c
[a-z] orice liter, a-z
[a\-z] unul din caracterele: a, -, z
[-az] unul din caracterele: -, a, z
[A-Za-z0-9]+ unul sau mai multe caractere alfanumerice
[ \t\n]+ spaii
[^ab] orice cu excepia caracterelor: a, b
[a^b] unul din caracterele : a, ^, b
[a|b] unul din caracterele : a, |, b
a|b unul din caracterele : a, b
Gh. Grigoras 17
Seciunea Declaraii mai poate conine blocuri
%{%}:
%{
#include <stdio.h>
#define pereche 2
%}
Seciunea Reguli:
exp_1 {Aciune_1}
exp_2 {Aciune_2}
.
.
.
exp_n {Aciune_n}
Gh. Grigoras 18
Variabile lex predefinite
Nume Funcia
Gh. Grigoras 19
Exemplul 1
%{
int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s", ++yylineno, yytext);
%%
int main(int argc, char *argv[]) {
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
Gh. Grigoras 20
Exemplul 2
letter [A-Za-z]
digit [0-9]
%{
int count;
%}
%%
{letter}({letter}|{digit})* {count++;}
. {}
%%
int main(void) {
yylex();
printf("number of identifiers = %d\n",
count);
return 0;
}
Gh. Grigoras 21
Exemplul 3
%{
int nchar, nword, nline;
%}
%%
\n { nline++; nchar++; }
[^ \t\n]+ { nword++, nchar += yyleng; }
. { nchar++; }
%%
int main(void) {
yylex();
printf("%d\t%d\t%d\n", nchar, nword, nline);
return 0;
}
Gh. Grigoras 22
Exemplul 4
%{
# include <stdio.h>
%}
litera [a-zA-Z]
cifra [0-9]
cifre ({cifra})+
semn [+-]
operator [+*/<>=-]
spatiu [' \t\n]
%%
"if" | "then" | "else" {printf("%s cuvant rezervat\n", yytext);}
({litera})({litera}|{cifra})* {printf("%s identificator\n", yytext);}
{cifre}|({semn})({cifre}) {printf("%s numar intreg\n", yytext);}
{operator} {printf("%c operator\n", yytext[0]);}
\:\= {printf("%s asignare\n", yytext);}
\: {printf("%c doua puncte\n", yytext[0]);}
(\()|(\)) {printf("%c paranteza\n", yytext[0]);}
{spatiu} {}
. {printf("%c caracter ilegal\n", yytext[0]);}
%%
int main( ){
yylex( );
return 0;
}
Gh. Grigoras 23