Академический Документы
Профессиональный Документы
Культура Документы
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
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 :
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
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> ->
:
:
:
:
:
:
:
:
:
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
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
Ao
revisin
.1
<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
Ao
revisin
.1
Pgina 4 de 8
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
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
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
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 (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
Rutinas semnticas
Inic_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)
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
Inic_com :
Op_div :
(Token = /)
Retorna (tipotoken = OPDIV)
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:
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.
-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