Sie sind auf Seite 1von 8

LENGUAJES Y COMPILADORES - UNLaM

Prof.: Jorge H. Doorn; Mara Capuya


JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

Analizador Lexicogrfico
La compilacin es un proceso destructivo en el cual el programa fuente se transforma por completo (o casi)
en un lenguaje que la mquina comprende y ejecuta (objeto). Este proceso contiene bsicamente 4 etapas
diferentes:
Anlisis lxico
Anlisis sintctico
Generador de cdigo intermedio
Generador de cdigo assembler

Tabla
De
Smbolos

Tira de tokens
Notacin intermedia
PGM
FUENTE

analizador
lxico

caracteres

analizador
sintctico

Generador de
cdigo
intermedio

6,4,6,3,7,5 lista de reglas

Generador
de cdigo
assembler

OBJETO

Cdigo ejecutable

La funcin general de un analizador lexicogrfico es transformar el flujo de caracteres que ingresan a travs
del programa fuente en una lista de componentes lxicos o tokens.
Bsicamente son componentes lxicos todas aquellas cadenas de smbolos que se forman a partir de las
reglas lxicas de la gramtica general del compilador
Por ejemplo : los identificadores, las constantes enteras, las constantes string, las palabras reservadas, las
constantes en otras bases, comentarios, los operadores lgicos, los operadores aritmticos, otros operadores,
etc.
Cada uno de estos tokens se clasifican segn su tipo :

ID ={a, sum, pepe, a1}

PR ={while, si , hasta, for}

CTE = {100, 20, 1 ,0}

OPMAS ={+}

OPASIG = {.=}

MAYORIG = {>=}

Etc
Para aquellos tokens que sean ambiguos (id, cteent, ctefloat,etc), el analizador lxico deber crear y
mantener una tabla de smbolos con informacin sobre cada uno de stos : nombre, tipo , longitud,
dimensin, puntos de alcance, etc.. Esta tabla ser utilizada por el compilador en etapas posteriores.
Pgina 1 de 8

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

Ejemplo
Supongamos un lenguaje bsico en el que se pueden escribir programas que contienen solamente sentencias
de asignaciones simples y comentarios simples limitados por dos smbolos al comienzo y los mismos
invertidos para terminarlos. Sea la siguiente gramtica cuyas reglas sintcticas y lxicas se detallan a
continuacin :
<Programa> :
<Lista_Sentencias>
<Sentencia> :
<Asig>
:
<Exp>
:
<Exp>
:
<Exp>
:
<Termino>
:
<Termino>
:
<Termino>
:
<Factor>
:
<Op_Asig>
<Op_Mas>
<Op_Menos>
<Op_Mul>
<Op_Div>
<P_Abre>
<P_Cierra>
<Id>
<Cte> ->

:
:
:
:
:
:
:
:
:

<PR_Begin> <Lista_Sentencias> <PR_End>


: <Sentencia> | <Lista_Sentencia> <Sentencia>
<Asig>
<Id> <Op_Asig> <Exp>
<Exp> <Op_Mas> <Termino>
<Exp> <Op_Menos> <Termino>
<Termino>
<Termino> <Op_Mul> <Factor>
<Termino> <Op_Div> <Factor>
<Factor>
<Id> | <Cte> | <P_Abre> <Exp> <P_Cierra>
:=
+
*
/
(
)
<Letra> | <Id><Letra> | <Id><Digito>
<Digito> | <Cte> <Digito>

REGLAS
SINTCTICAS

REGLAS
LEXICAS

Los distintos tokens o componentes lxicos sern aquellos que queden determinados por las reglas lxicas :
Op_Asig, Op_Mas, Op_Menos, Op_Mul, Op_Div, P_Abre, P_Cierra, IDs,CTEs

Cualquier programador que lea el siguiente fragmento de cdigo


begin
total .= parcial * 21 desc
end
Entender que en esta sentencia de asignacin hay:

Una palabra reservada: begin

Un identificador: total

Un operador de asignacin: .=

Un identificador: parcial

Un operador de multiplicacin: *

Una constante: 21

Un operador de sustraccin:
Un identificador: Desc
Pgina 2 de 8

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

Una palabra reservada: end


Cuando el AL examina dicho fragmento procede devolviendo la siguiente lista de tokens:

<PR: begin > <ID: total > <OPASIG> <ID: parcial > <OPMUL> <CTE: 21> <OPMENOS> <ID: desc >
<PR: end >

Ntese que, para los espacios, tabuladores, retornos, escape, etc. el AL devuelve la misma lista, ya que stos
se ignoran al igual que los comentarios.
Por el programa enunciado, se construye una tabla de smbolos que debe actualizarse con los tres
identificadores y la constante.
Diseo de un analizador lexicogrfico

El analizador lexicogrfico es un programa que trabaja junto o separadamente (depende el compilador) con
el analizador sintctico.
Para poder llevar adelante el diseo de un AL, es necesario modelar el programa a travs de un diagrama de
estados finito o autmata finito.
Para el ejemplo anterior es:

Pgina 3 de 8

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

Especificacin de las estructuras de datos del programa


Matriz de transicin de estados o matriz de nuevo estado
El formato es : int nuevo_estado [n] [m] donde
n : representa los estados del autmata
m : representa los caracteres o grupo de caracteres del autmata.

Pgina 4 de 8

LENGUAJES Y COMPILADORES - UNLaM

0
1
2
3
4
5
6
7
8
9
10
11
12
13

Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Q8
Q9
Q10
Q11
Q12
Q13

Ao

Apunte Analizador Compilador


Lexicogrfico

Prof.: Jorge H. Doorn; Mara Capuya


JTPs: Hernn Villarreal
Ayte: Pablo Pomar

revisin

.1

10

letra
Q1
Q1
Q13
Q13
Q13
Q13
Q13
Q13
Q13

digito
Q2
Q1
Q2
Q13
Q13
Q13
Q13
Q13
Q13

+
Q3
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

Q4
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

*
Q5
Q13
Q13
Q13
Q13
Q13
Q11
Q13
Q13

/
Q6
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

(
Q7
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

)
Q8
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

.
Q9
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

bl,ent
Q0
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13

Q13
Q11
Q11

Q13
Q11
Q11

Q13
Q11
Q11

Q13
Q11
Q11

Q13
Q12
Q12

Q13
Q11
Q0

Q13
Q11
Q11

Q13
Q11
Q11

Q13
Q11
Q11

Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q13
Q10
Q13
Q11
Q11

Q13
Q11
Q11

Matriz de punteros a funciones semnticas


(* proceso (void) [n] [m]) = {
Init_id, Init_cte, Op_suma,Op_resta,Op_mul,Ini_com,Par_Abre,Par_Cierr,Init_asig,Error,Nada
Cont_id, Cont_id , fin_id, fin_id, fin_id,....................................
}

0
1
2
3
4
5
6
7
8
9
10
11
12
13

Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
Q8
Q9
Q10
Q11
Q12
Q13

letra
Inic_Id
Cont_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

Digito
Inic_cte
Cont_id
Cont_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

+
Op_suma
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

Op_resta
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

*
Op_mul
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Nada
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

/
Inic_com
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

6
(
Par_Abre
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

7
)
Par_Cierr
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

8
.
Inic_asig
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

10

=
Error
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Cont_asig
Fin_asig
Nada
Nada

bl,ent
Nada
Fin_id
Fin_cte
Op_suma
Op_resta
Op_mul
Op_div
Par_Abre
Par_Cierr
Error
Fin_asig
Nada
Nada

Programacin del modelo de autmata


En general el analizador lxico es una funcin que va recorriendo el autmata hasta que reconoce un token o
componente, esto ltimo sucede cuando llega a un estado final.
Una vez que reconoci un componente lxico o token devuelve que tipo de token reconoci y cual es su
posicin en la tabla de smbolos, si dicho token se encuentra presente all
Pgina 5 de 8

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

La funcin principal es recorrer el autmata a travs de la matriz de estados y ejecutar cada proceso segn
corresponda sabiendo que el autmata siempre arranca del estado 0.
Para ello se define una funcin llamada yylex que retorna un entero y ser invocada cada vez que se solicite
un nuevo token. El entero devuelto por la funcin se encuentra asociado al nmero de token reconocido.
Por otra parte, se reserva el nombre de la variable yylval para asegurar la posicin en la tabla de smbolos del
token ledo, si corresponde.
El esqueleto principal es :
Main ()
Apertura de Archivo
Mientras not eof( Archivo)
{
Leer (c)
tipotoken = yylex ()
}
Cierre de Archivos

Get_evento : toma un carcter y devuelve el nmero de columna de las matrices

get_evento (c)
case c
a..z 0 (columna 0 de ambas matrices)
0..1 1 (columna 1 de ambas matrices)
+ 2 (columna 2 de ambas matrices)
- 3 (columna 3 de ambas matrices)
* 4 (columna 4 de ambas matrices)
/
5 (columna 5 de ambas matrices)
( 6 (columna 6 de ambas matrices)
) 7 (columna 7 de ambas matrices)
. 8 (columna 8 de ambas matrices)
= 9 (columna 9 de ambas matrices)
bl,ent,esc 10 (columna 9 de ambas matrices)
otherwise
ERROR (cortar proceso)
Fin

int yylex (void)


estado = 0;
estado final = 13
while (estado != estado final)
{
Pgina 6 de 8

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Apunte Analizador Compilador


Lexicogrfico

columna = get_evento (c)


/*obtener la columna de la matriz*/
(*proceso [estado] [columna]) ()
estado = nuevo_estado [estado] [columna]
leer (c)
}
unget (c)
/*si corresponde*/
modifica la variable yylval
/*posicin en tabla de smbolos -1*/
retorna (tipotoken)

Rutinas semnticas
Inic_id

agrega caracter a Token


long = 1

Cont_id agrega caracter a Token


long = long +1
verifica longitud
Fin_id

verifica si es reservada
Si es Palabra Reservada retorna (tipotoken = PR)
sino (es identificador)
si no est en Tabla de Smbolos agrega Token en tabla de smbolos
si est en Tabla de Smbolos yylval := posicin en TS
retorna (tipotoken = ID)

Inic_cte : agrega dgito a Token


cte = cte* 10 + dgito
verificar mximo
Cont_cte : agrega digito a Token
cte = cte* 10 + dgito
verificar mximo
Fin_cte :

si no est en Tabla de Smbolos agrega Token en tabla de smbolos


si est en Tabla de Smbolos yylval := posicin en TS
retorna (tipotoken = CTE)

Op_suma : (Token = +)
Retorna (tipotoken = OPMAS)
Op_resta : (Token = -)
Retorna (tipotoken = OPMENOS)
Op_mul : (Token = *)
Retorna (tipotoken = OPMUL)
Pgina 7 de 8

Ao

revisin

.1

LENGUAJES Y COMPILADORES - UNLaM


Prof.: Jorge H. Doorn; Mara Capuya
JTPs: Hernn Villarreal
Ayte: Pablo Pomar

Inic_com :

Agrega carcter(/) a Token

Op_div :

(Token = /)
Retorna (tipotoken = OPDIV)

Apunte Analizador Compilador


Lexicogrfico

Ao

revisin

.1

Par_Cierr : (Token = ) )
Retorna (tipotoken = P_CIERRA)
Par_Abre : (Token = ( )
Retorna (tipotoken = P_ABRE)
Inic_Asig : Agrega carcter(.) a Token
Cont _Asig: Agrega carcter(=) a Token
Fin _Asig:

Retorna (tipotoken = OPASIG)

Cada vez que el AL es invocado debe devolver por CADA TOKEN:

el tipo
(si bien la forma de devolver el tipo de token es arbitraria (puede ser un string, un entero que
represente el token, algn tipo de estructura, etc.), la funcin que implementa el analizador
lxico ( yylex() ) devolver un tipo entero que se redefinir como un string.

la posicin en tabla de smbolos a travs de la variable yylval

la posicin en la tabla donde se encuentra el token si el token est en la tabla de


smbolos

-1

yylval
en caso contrario

Error lxico

NOTA
Por cada llamada, la funcin yylex() debe devolver uno y slo un token.

Pgina 8 de 8

Das könnte Ihnen auch gefallen