Documente Academic
Documente Profesional
Documente Cultură
Analiza lexical
2.1. Funciile unui analizor lexical
Analiza lexical este prima faz a procesului de compilare,
fiind efectuat de analizorul lexical.
Analizorul lexical are la intrare programul surs i produce
la ieire atomi lexicali. (figura 2.1).
Program surs
Analizor
lexical
Atomi lexicali
Program surs
Gestionare
caractere
begin
x:=1;
..
\n
le
xi
ca
li
\n
..
Analizor
lexical
cuv.cheie
id
atribuire
numar
begin
:=
..
De exemplu:
cuvnt cheie
begin
clasa
Cod lexical
100
identificator alfa
clasa
atribut
200
adresa
Atomul numeric 5
clasa
atribut
Pointeaz spre
tabela de
simboluri unde
s-a memorat
atomul alfa
300
5
...
5
struct inregistrare
{
tip_atom valoare; //codul atomului
char * stringval; // atriburul identificatorului
int numval; // atributul unui numr
};
struct inregistrare
{
tip_atom valoare;
union {
char * stringval;
int numval;
} atribute;
};
Program surs
Analizor
lexical
Prima
trecere
Coduri de
atomi
Fiier
Memorie
Analizor
sintactic
Urmtoarea
trecere
Analizor
sintactic
Codul
atomului
urmtor
gettoken()
Program
surs
Analizor
lexical
4.
Pointerul de intrare
destinat
unui analizor
astfel:
id, pointer la tabela de simboluri pentru E
assign_op, :=
id, pointer la tabela de simboluri pentru M
mult_op, *
id, pointer la tabela de simboluri pentru C
exp_op, **
num, 2
10
12
\n
\n
pi
pa
pi
b
pa
e
n
pi
\n
pa
Figura 2.7. Folosirea a doi pointeri pentru identificarea unui atom
13
Strile iniiale ale fiecrei diagrame sunt de fapt reunite ntro singur stare iniial, referit n continuare ca "stare0".
Aceasta semnific faptul c nu s-a decis nc ce diagram se
va urma. Alegerea diagramei se face pe baza caracterului de
la intrare.
digit
not(digit)
3*
digit
{
letter
23
24
not(letter|digit)
25*
letter|digit
8
sp
10
11
not(sp)
12*
sp
13
17
21
14
18
15
19
22
15
16
=
20
<stdio.h>
<ctype.h>
<stdlib.h>
<string.h>
"alex.h"
case 2:
c = getchar();
if (isdigit(c))
*pbuf++ = c;
else
stare = 3;
break;
case 3:
token.info.valoare= atoi(buf);
token.type = numar;
ungetc(c,stdin);
stare = 0; return &token;
break;
case 5:
token.type = acol_l;
stare = 0; return &token;
break;
case 7:
token.type = acol_r;
stare = 0; return &token;
break;
case 9:
token.type = par_l;
stare = 0; return &token;
break;
case 11:
c = getchar();
if (isspace(c));
else
stare = 12;
break;
case 12:
ungetc(c,stdin);
stare = 0;
break;
case 14:
token.type = par_r;
stare = 0; return &token;
break;
case 16:
token.type = plus;
18
{
TOKEN *t;
while (((t=alex())!=0))
{
printf("%s",token_nume[t->type]);
switch(t->type)
{
case nume:
printf(":%s\n",t ->info.nume);
break;
case numar:
printf(":%d\n",t ->info.valoare);
break;
default:
printf("\n");
break;
}
}
return 0;
}
20