Lenguajes y Automatas II - Repaso
Lenguajes y Automatas II - Repaso
Lenguajes y Automatas II - Repaso
Programacin de sistemas.
Conjunto de reglas para crear soluciones a problemas computables. Conjunto de
herramientas que nos permiten crear software de base que son de utilidad para
interactuar con la mquina.
Software de base.
Compilador, Sistema Operativo, Cargador.
Autmata.
Son las cadenas posibles que aceptan un lenguaje.
Expresiones regulares.
Conjunto de smbolos que aceptan una palabra reservada.
Gramtica.
Reglas para escribir las sentencias del lenguaje.
Lenguaje de programacin.
Un lenguaje de programacin est formado por un conjunto de smbolos bsicos
(alfabeto) y un conjunto de reglas que especifican como manipularlos. Tambin debe
darle significado a las cadenas formadas al manipular los smbolos bsicos.
Los lenguajes de programacin pueden clasificarse de acuerdo a su semejanza con
el lenguaje maquina (bajo nivel) o a su semejanza con el lenguaje humano,
generalmente ingls (Lenguajes de alto nivel).Entre los lenguajes de bajo nivel se
encuentra el lenguaje ensamblador.
Un programa escrito en un lenguaje de programacin necesita pasar por un proceso
de compilacin, es decir, ser traducido al lenguaje de mquina, o ser interpretado
para que pueda ser ejecutado por el ordenador.
Los lenguajes son sistemas de comunicacin. Un lenguaje de programacin consiste
en todos los smbolos, caracteres y reglas de uso que permiten a las personas
comunicarse con las computadoras. Existen por lo menos varios cientos de
lenguajes y dialectos de programacin diferentes. Algunos se crean para una
aplicacin especial, mientras que otros son herramientas de uso general ms
flexibles que son apropiadas para muchos tipos de aplicaciones.
En todo caso los lenguajes de programacin deben tener instrucciones que
pertenecen a las categoras ya familiares de entrada/salida, clculo/manipulacin de
textos, lgica/comparacin y almacenamiento/recuperacin.
No obstante, aunque todos los lenguajes de programacin tienen un conjunto de
instrucciones que permiten realizar dichas operaciones, existe una marcada
diferencia en los smbolos, caracteres y sintaxis de los lenguajes de mquina,
lenguajes ensambladores y lenguajes de alto nivel.
Traductores
Un traductor es un programa que recibe como entrada cdigo escrito en un cierto
lenguaje (programa fuente) y produce como salida cdigo en otro lenguaje
(programa objeto). Generalmente el lenguaje de entrada es de ms alto nivel que el
de salida. Ejemplos de traductores son los ensambladores y los compiladores.
Un ensamblador es un programa que traduce de un lenguaje ensamblador a
lenguaje mquina, mientras que un compilador es un programa que traduce de un
lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje mquina. Si el fuente
es un lenguaje de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel
o de mquina, el traductor es un compilador.
Diseo de lenguajes. El lenguaje de programacin puede definirse al describir
1. Lo que parecen sus programas (la sintaxis del lenguaje)
2. lo que significan sus programas (la semntica del lenguaje).
La sintaxis es la disposicin de palabras como elementos en una oracin para
mostrar su relacin, describe la serie de smbolos que constituyen programas
validos. El enunciado en C: X=Y+Z representa una serie vlida de smbolos, en tanto
que X,Y+- no representa una secuencia valida de smbolos para un programa en C.
La sintaxis suministra informacin significativa que se necesita para entender un
programa y proporciona informacin imprescindible para la traduccin del programa
fuente o un programa objeto. Ejemplo de la expresin: 2+3*4 tiene el valor de 14 y
no 20, se puede especificar una u otra interpretacin, si se desea, por sintaxis y con
ello guiar al traductor a la generacin de las operaciones correctas para evaluar esta
expresin.
Como en la expresin ambigua en espaol, nada en el agua, el solo desarrollo de
una sintaxis de lenguaje es insuficiente para especificar sin ambigedad la
estructura de un enunciado. En un enunciado como X= 2.45+3.67, la sintaxis no nos
puede decir si se declar la variable X, o si X se declaro como tipo real.
Los resultados de X=5, X=6 y X=6.12, son todos posibles si X y + denotan enteros, X
denota un entero y + es adicin de nmeros reales, y X y + denotan valores reales,
respectivamente. Se necesita algo ms que solo estructuras sintcticas, para la
plena descripcin de un lenguaje de programacin. Otros atributos, bajo el trmino
general de semntica, como en el uso de declaraciones, operaciones, control de
secuencia y entornos de refinamiento, afecta a una variable y no siempre estn
determinados por reglas de sintaxis.
Criterios generales de sintaxis.
El propsito primordial de la sintaxis es proveer una notacin para la comunicacin
entre el programador y el procesador de lenguajes de programacin. Sin embargo, la
eleccin de estructuras sintcticas particulares esta restringida slo ligeramente por
la necesidad de comunicar elementos particulares de informacin. A continuacin se
citan criterios generales de sintaxis.
Legibilidad
Facilidad de escritura
Facilidad de verificacin
Facilidad de traduccin
Carencia de ambigedad
ELEMENTOS SINTCTICOS DE UN LENGUAJE
Conjunto de caracteres
Smbolos de operadores
Palabras clave y palabras reservadas
Palabras pregonadas
Comentarios
Espacios en blanco
Delimitadores y corchetes
Formatos de campos libres y fijos
Expresiones
Enunciados
ARITMETICOS
LENGUAJE
LOGICOS
PASCAL
AND
NOT
OR
RELACIONALES
<
>
>
<
=
=
ASIGNACION
:=
DELIMITADORES
OPERACIONALES
PALABRAS
RESERVADAS
+,-,*,/,MOD
CICLOS
DECLARACION DE VARIABLES
DECLARACION DE CONSTANTES
ESTRUCTURA DE UN COMPILADOR
En esta etapa se crea la tabla de smbolos, la cual contiene las variables y el tipo de
dato al que pertenece, las constantes literales, el nombre de funciones y los
argumentos que reciben etc.
En el anlisis sintctico como su nombre lo indica se encarga de revisar que los
tokens estn ubicados y agrupados de acuerdo a la definicin del lenguaje. Dicho de
otra manera, que los tokens pertenezcan a frases gramaticales validas, que el
compilador utiliza para sintetizar la salida. Por lo general las frases gramaticales son
representadas por estructuras jerrquicas, por medio de rboles de anlisis
sintctico. En esta etapa se completa la tabla de smbolos con la dimensin de los
identificadores y los atributos necesarios etc.
El anlisis semntico se encarga de revisar que cada agrupacin o conjunto de
token tenga sentido, y no sea un absurdo. En esta etapa se rene la informacin
sobre los tipos para la fase posterior, en esta etapa se utiliza la estructura jerrquica
de la etapa anterior y as poder determinar los operadores, y operandos de
expresiones y preposiciones.
Fase de Sntesis:
Etapa de generacin de cdigo intermedio, aunque algunos compiladores no la
tienen, es bueno saber de su existencia, en esta etapa se lleva el cdigo del
programa fuente a un cdigo interno para poder trabajar mas fcilmente sobre l.
Esta representacin interna debe tener dos propiedades, primero debe ser fcil de
representar y segundo debe ser fcil de traducir al cdigo objeto.
Optimizacin de cdigo, se busca obtener el cdigo mas corto y rpido posible,
utilizando distintos algoritmos de optimizacin.
Generacin de cdigo, se lleva el cdigo intermedio final a cdigo maquina o
cdigo objeto, que por lo general consiste en un cdigo maquina relocalizable o
cdigo ensamblador. Se selecciona las posiciones de memoria para los datos
(variables) y se traduce cada una de las instrucciones intermedias a una secuencia
de instrucciones de maquina puro.
La tabla de smbolos no es una etapa del proceso de compilacin, sino que una
tarea, una funcin que debe realizar el proceso de compilacin.
En ella se
almacenan los identificadores que aparecen en el cdigo fuente puro, como as
tambin los atributos de los mismos, su tipo, su mbito y en el caso de los
procedimientos el nmero de argumentos el tipo de los mismos etc.
En otras palabras una tabla de smbolos es una estructura de datos, que contiene un
registro por cada identificador, y sus atributos.
La tabla de smbolo es accedida tanto para escritura como parar lectura por todas
las etapas.
Detector de errores o manejador de errores, al igual que la tabla de smbolos no es
una etapa del proceso de compilacin, si no que es una funcin, muy importante,
pues al ocurrir un error esta funcin debe tratar de alguna forma el error para as
seguir con el proceso de compilacin (la mayora de errores son detectados en las
etapas de anlisis lxico, anlisis sintctico, anlisis semntico).
Supongamos que un compilador tiene que analizar la siguiente preposicin:
Preposicin: suma = var1 + var2 + 10;
Anlisis Lxico
El analizador lxico lee los caracteres del programa fuente, y verifica que
correspondan a una secuencia lgica (identificador, palabra reservada etc.). Esta
secuencia de caracteres recibe el nombre componente lxico o lexema. En este
caso el analizador lxico verifica si el identificador id1 (nombre interno para "suma")
encontrado se halla en la tabla de smbolos, si no esta produce un error porque
todava no fue declarado, si la preposicin hubiese sido la declaracin del
identificador "suma" en lenguajes C, C++ (int suma;) el analizador lxico agregara
un identificador en la tabla de smbolos, y as sucesivamente con todos los
componentes lxicos que aparezcan.
id1= id2+ id3 * 10
Anlisis Sintctico
El analizador sintctico impone una estructura jerrquica a la cadena de
componentes lxicos, generada por el analizador lxico, que es representada en
forma de un rbol sintctico.
=
/ \
id1 +
/ \
id2 +
/ \
id3 10
Anlisis Semntico
El analizador semntico verificara en este caso que cada operador
operandos permitidos.
tenga los
=
/ \
id1 +
/ \
id2 +
/ \
id3 tipo_ent
|
10
Generador de cdigo intermedio.
Esta etapa se lleva la preposicin a una representacin intermedia como un
programa para una maquina abstracta.
temp1= tipo_ent(10)
temp2= id3 * temp1
temp3= id2 + tem2
id1= temp3
Optimizacin de cdigo.
El cdigo intermedio obtenido es representado de una forma mas optima y eficiente.
temp1= id3 * 10.0
id1= id2 + temp1
Generador de cdigo.
Finalmente lleva el cdigo intermedio a un cdigo objeto que en este caso es un
cdigo relocalizable o cdigo ensamblador (tambin llamado cdigo no enlazado).
MOVF id3, R2
MULT #10.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1
Este el cdigo objeto obtenido que es enviado al modulo de ensamblado. Para
entender todo esto veamos un ejemplo utilizando como lenguaje en este caso al
popular lenguaje de programacin C creado por Kernighan y Ritchie. El siguiente
cdigo esta definido de acuerdo al standard ANSI C.
#include<stdio.h>
void main()
{
char* frase= " Hola Mundo...!!!";
printf("%s", frase );
}
Al pasar por l modulo de preprocesado, el cdigo fuente queda de la siguiente
manera.
# 1 "hmundo.c"
# 1 "c:/compilador/include/stdio.h" 1 3
# 1 " c:/compilador/include/sys/types.h" 1 3
# 12 " c:/compilador/include/stdio.h" 2 3
typedef void *va_list;
typedef long unsigned int size_t;
typedef struct {
int _cnt;
char *_ptr;
char *_base;
int _bufsiz;
int _flag;
int _file;
char *_name_to_remove;
} FILE;
El nuevo cdigo contiene el encabezado o prototipo de la/s funcines que se
encuentran en el archivo de cabecera stdio.h, y que sern posiblemente utilizadas
en el cdigo fuente original. Este cdigo es pasado al modulo de compilacin quien
luego de analizarlo y verificar si se encuentra correcto, transformara el cdigo fuente
puro (expandido) en cdigo ensamblador y lo enva al modulo de ensamblado.
.file "hmundo.c"
compiler_compiled.:
___compiled_c:
.text
LC0:
.ascii " Hola Mundo...!!!\0"
LC1:
Este cdigo ser analizado por l modulo de ensamblado, que lo llevara a cdigo
binario no enlazado, y lo enviara al modulo de enlazado. El cdigo de salida enviado
al modulo de enlazado es el siguiente.
L�(7�.text�
@���� �
.............
.data�@�@�@�
.bss�@�@�€
Hola Mundo...!!!�%s�v�
UE�EPh�
v�.file��
ghmundo.c����.
CARGADORES
La programacin de sistemas se refiere a la creacin de programas cuya finalidad es
servir a otros programas.
Entre los programas que se manejan en la programacin de sistemas se encuentran:
los sistemas operativos, los compiladores, los manejadores de base de datos.
Un cargador es un programa que coloca en la memoria para su ejecucin, el
programa guardado en algn dispositivo de almacenamiento secundario.
Dependiendo de la manera en que se manejan los procesos de ligas y carga,
podemos clasificar a los cargadores en: cargadores iniciales, absolutos, con
reubicacin y ligadores.
ENSAMBLADORES
Que es ensamblador y para que sirve?
Cuando se empezaron a utilizar smbolos nemotcnicos, se escribieron programas
para traducir automticamente los programas escritos en lenguaje ensamblador a
lenguaje mquina. A estos programas traductores se les llamo ensambladores.
La entrada para un ensamblador es un programa fuente escrito en lenguaje
ensamblador. La salida es un programa objeto, escrito en lenguaje de mquina. El
programa objeto incluye tambin la informacin necesaria para que el cargador
pueda preparar el programa objeto para su ejecucin.
Para evitar confusiones, de aqu en adelante llamaremos lenguaje ensamblador al
conjunto de nemotcnicos y a las reglas para su manejo. Al programa que traduce
un programa objeto a partir de un programa escrito en lenguaje ensamblador lo
llamaremos ensamblador
11
Rapidez
Mayor control de la computadora
Independencia del lenguaje
La mayora de las computadoras pueden ensamblarlo
Dependencia de hardware
Mayor tiempo de codificacin
Comprensin mas profunda de la computadora
Errores mas frecuentes en el programa
Tipos de Ensambladores.
Aunque todos los ensambladores realizan bsicamente las mismas tareas, podemos
clasificarlos de acuerdo a caractersticas.
As podemos clasificarlos en:
Ensambladores Residentes.
12
Macroensambladores.
Microensambladores.
Estos ensambladores leen una lnea del programa fuente y la traducen directamente
para producir una instruccin en lenguaje mquina o la ejecuta si se trata de una
pseudoinstruccin. Tambin va construyendo la tabla de smbolos a medida que van
apareciendo las definiciones de variables, etiquetas, etc.
Debido a su forma de traduccin, estos ensambladores obligan a definir los smbolos
antes de ser empleados para que, cuando aparezca una referencia a un
determinado smbolo en una instruccin, se conozca la direccin de dicho smbolo y
se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos y
ocupan poco espacio, pero tiene el inconveniente indicado.
13
14
MACROPROCESADORES
USOS DE UN MACROPROCESADOR
Con el fin de evitar al programador la tediosa repeticin de partes idnticas de
un programa, los ensambladores y compiladores cuentan con macroprocesadores
que permiten definir una abreviatura para representar una parte de un programa y
utilizar esa abreviatura cuantas veces sea necesario.
Para utilizar una macro, primero hay que declararla. En la declaracin se
establece el nombre que se le dar a la macro y el conjunto de instrucciones que
representar.
El programador escribir el nombre de la macro en cada uno de los lugares donde
se requiera la aplicacin de las instrucciones por ella representadas.
La declaracin se realiza una sola vez, pero la utilizacin o invocacin a la
macro (macrollamada) puede hacerse cuantas veces sea necesario.
La utilizacin de macros posibilita la reduccin del tamao del cdigo fuente,
aunque el cdigo objeto tiende a ser mayor que cuando se utilizan funciones.
Es tan comn el empleo de macroinstrucciones se les considera como una
extensin de los lenguajes. De manera similar se considera al procesador de
macroinstrucciones o macroprocesador como una extensin del ensamblador o
compilador utilizado.
El macroprocesador se encarga, en una primera pasada, de registrar todas
las declaraciones de macros y de rastrear el programa fuente para detectar todas las
macrollamadas. En cada lugar donde encuentre una macrollamada, el
macroprocesador har la sustitucin por las instrucciones correspondientes. A este
proceso de sustitucin se le denomina expansin de la macro.
El macroprocesador elabora dos tablas para el manejo de las macros:
Una tabla de macronombres que consiste de los nombres de las macros y un ndice
que le permite localizar la definicin de la macro en otra tabla llamada tabla de
macrodefiniciones.
Como su nombre lo indica, la tabla de macrodefiniciones contiene las
definiciones de todas las macros a utilizar en el programa.
En ocasiones es conveniente agrupar macros, de acuerdo a las tareas que
realizan, y almacenarlas en archivos que se constituyen en bibliotecas de macros.
De esta manera, cuando se requiera la utilizacin de alguna macro en
particular, se incluye en el programa fuente el archivo de la biblioteca de macros
correspondiente.
15
COMPILADORES
La necesidad de establecer comunicacin con dispositivos de cmputo para
un creciente nmero de usuarios ha obligado a construir herramientas que permitan
que esta comunicacin se realice de manera ms efectiva y con menor consumo de
tiempo.
Se le atribuye a Grace Murray Hopper la acuacin de este trmino y se
refera al trabajo que estaba detrs de la programacin en aquellos tiempos: exista
una biblioteca de programas constituida de un conjunto de rutinas, cada una de ellas
probada individualmente; cuando se necesitaba un programa, se elegan las rutinas
necesarias de esa biblioteca y se integraban para conformar el proceso que
ejecutara la computadora. Quin realizaba este trabajo de acopio de rutinas y de
integracin se le denominaba compilador, de ah que los nuevos lenguajes tuviesen
sus propios "compiladores" para la integracin del proceso que programar
representaba.
En nuestros das, el trmino an se conserva aunque con un sentido
ligeramente diferente al planteado por Hopper. Hoy en da, un compilador es un
traductor que facilita la comunicacin entre el programador y la mquina, por medio
de un proceso de transformacin.
Un compilador es un programa que lee las lneas escritas en un lenguaje de
programacin (como Pascal) y las traduce a otro que pueda ejecutar la
computadora. Los programas compilados se ejecutan ms rpido que los
interpretados, debido a que han sido completamente traducidos a lenguaje de
mquina y no necesitan compartir memoria con el intrprete.
A grandes rasgos un compilador es un programa que lee un programa escrito
es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro
lenguaje, el lenguaje objeto. Como parte importante de este proceso de traduccin,
el compilador informa a su usuario de la presencia de errores en el programa fuente.
Clasificacin de Compiladores
El programa compilador traduce las instrucciones en un lenguaje de alto nivel a
instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje
de programacin se requiere un compilador separado.
El compilador traduce todo el programa antes de ejecutarlo. Los compiladores
son, pues, programas de traduccin insertados en la memoria por el sistema
operativo para convertir programas de cmputo en pulsaciones electrnicas
ejecutables (lenguaje de mquina). Los compiladores pueden ser de:
16
una sola pasada: examina el cdigo fuente una vez, generando el cdigo o
programa objeto.
17
ANLISIS LXICO
EL ANALIZADOR LXICO
El analizador lxico lee los caracteres del programa fuente, y verifica que
correspondan a una secuencia lgica (identificador, palabra reservada etc.). Esta
secuencia de caracteres recibe el nombre componente lxico o lexema.
FUNCIN DEL ANALIZADOR LXICO
18
19
Si
a>b
Entonces
a=c+d:
FinEntonces:
pasara a ser Si a>b Entonces a=c+d: FinEntonces: en nuestra lista de entrada.
Una vez que tenemos la lista de entrada limpia se procede a la creacin de
los tokens; para ello, se ha definido otro tipo de lista llamado Tokens que contendr
el nombre del token (cadena leda por la pantalla) junto con el tipo al que pertenece.
La implementacin del analizador lxico responde al mtodo general de
programacin visto en teora, por lo tanto se manejan dos punteros, uno al ltimo
carcter ledo y otro al ltimo carcter aceptado con lo cual podemos movernos por
la lista de entrada en bsqueda del siguiente token sin perder la posicin desde
donde comenzamos la presente bsqueda. Los tokens, o smbolos terminales de la
gramtica, han sido representados mediante dos tablas, una para los que van
acompaados de un parntesis y otra para los que no.
El motivo de esta separacin ha sido el trato distinto que se les ha dado a
ambos para no tener que distinguir, dentro de las rdenes que lleva un parmetro, si
entre el final de la orden y el parntesis que rodea al parmetro hay o no espacios.
As las ordenes Mira (id) y Mira(id) son tratadas como el mismo token y toman el ``(''
como parte de l.
Los smbolos separadores (espacios, ``:'', etc.) han sido recogidos del mismo
modo en otra tabla dado el trato distinto de los anteriores que recibirn.
Con esta forma de recoger los tokens que reconoce este analizador hemos
conseguido no tener que realizar grandes modificaciones sobre esta fase del
compilador, si algn da fuera modificado el conjunto de smbolos terminales de la
gramtica.
ANLISIS LXICO: DESARROLLO
Objetivo
El objetivo bsico del scanner o analizador lxico es separar el programa
fuente en unidades mnimas y asociarles una determinada clase o token.
Por qu?
20
Eficiencia, porque es el nico proceso que lee el programa fuente y por ello
pueden estudiarse tcnicas especializadas de manejo de dispositivos de
almacenamiento (la eficiencia es ms fcilmente alcanzable partiendo de
expresiones regulares que de gramticas).
Diseo modular del compilador, relacionado con esto ltimo.
Portabilidad, ya que la mayora de diferencias del mismo lenguaje entre distintos
entornos suele ser en caracteres especiales, capitalizacin, cdigos de
caracteres, etc. y as se encapsulan en el scanner.
Funciones del scanner
Las funciones bsicas del scanner son:
21
Lexemas ejemplo
pc-then
then
(t/T)(h/H)(e/E)(n/N)
pc-while
while
while
pc-printf
write
write
op-rel
<
<
>
>
par-ab
par-cer
ident
Hola, A77aH,
pepe
lit-ent
34, 23442, 1
lit-real
34.0, 23.4e-5
lit-string
22
Las palabras clave suelen ser reservadas. Cuando no lo son (por ejemplo, en
PL/I), el scanner debe distinguir entre palabras clave e identificadores, lo cual
suele ser complicado.
Por ejemplo:
if then then then = else ; else else = then;
23
representa la funcin de transicin y los estados por los que se acepta cada
uno de los smbolos
qo estado inicial
F conjunto de estados finales
Son los posibles smbolos que puede aceptar un lenguaje los cuales se pueden
representar con un autmata. Conjunto de smbolos para aceptar una palabra
reservada.
Una expresin regular es una frmula para denotar "ciertos" lenguajes.
Advirtase que decimos lenguaje, no cadena de caracteres. Una expresin
regular nica denota un conjunto de cadenas, es decir un lenguaje, no una
simple cadena. Las expresiones regulares se pueden usar para especificar
unidades lxicas presentes en un lenguaje de programacin. No todos los
lenguajes pueden ser expresados utilizando una expresin regular.
Sea un alfabeto . La expresin regular sobre y los conjuntos que denotan se
definen de manera recursiva como sigue:
1. es una expresin regular y denota al conjunto vaco {}.
2. Para cada a , a es una expresin regular y denota al conjunto {a}.
3. Si r y s son expresiones regulares que denotan a los lenguajes R y S.;
respectivamente, entonces tenemos lo siguiente.
r+s
(r)
rs
r*
r+
ri
Errores Lxicos
Son pocos los errores detectables en el analizador lxico porque se tiene una
visin restringida del programa, ya que no se puede distinguir entre un error de
escritura de un identificador y una palabra reservada, as como la declaracin y
utilizacin de una funcin, porque todas las consideran en esta fase como un
identificador vlido y los errores se empiezan a detectar entre el analizador
semntico o el analizador sintctico, segn sea el caso.
Tcnicas de correccin de errores
24
Valor
;
integer
:
velocidad
,
inicial
Var
Delimitador
P. R. Int
S. Punt.
Id
Separador
Id
P. R. Var
Posicin en
memoria
Utilizado
por
25
26
ANLISIS SINTCTICO
El objetivo fundamental del anlisis sintctico es "construir un rbol sintctico"
con la cadena de entrada (el "programa"), en la forma de unidades lxicas que
determina el analizador lxico, como se muestra en la siguiente figura:
28
29
dificultad para afrontar situaciones en que el error real se produjo antes del punto de
deteccin.
30
Gramtica
Autmata
Ejemplo
Lenguajes
Gramtica Regular
Detector deterministico
no deterministico
finito
a*
Regulares
+ Gramtica-lineal
Derecha
+
Gramtica-lineal
Izquierda
Lenguaje libre
de contexto
+ Gramtica libre de
contexto
Autmata pushdown
no
ab
31
deterministico
Lenguaje sensible al +Gramtica Sensible
contexto
al contexto
Lenguajes
Recursivos
Enumerables
+ Gramtica norestringida
Autmata LinealVinculada
abc
Maquina de Turng
Cualquier
Funcin
Computable
Jerarqua de Chomsky.
En 1959, Noam Chomsky clasific las gramticas en cuatro tipos de lenguajes
y esta clasificacin es conocida como la jerarqua de Chomsky, tal como se muestra
en al Tabla 3.1, en la cual cada lenguaje es descrito por el tipo de gramtica
generado. Estos lenguajes sirven como base para la clasificacin de lenguajes de
programacin.
Los cuatro tipos son: lenguajes recursivamente enumerables, lenguajes
sensibles al contexto, lenguajes libres de contexto y lenguajes regulares. Dichos
lenguajes tambin se identifican como lenguajes de tipo 0,1,2 y 3.
Las gramticas sensibles al contexto reciben el nombre de gramticas de tipo
1, porque del lado izquierdo puede haber ms de un elemento, lo que implica que un
smbolo puede reemplazarse en el contexto de otros.
Una gramtica es de tipo 1 si se exige que la longitud del miembro derecho de
toda regla de produccin sea mayor o igual que la longitud del izquierdo. Con esto
se impide que las cadenas que se obtengan en el transcurso de la aplicacin de las
reglas sean de longitud decreciente, y se impide as mismo el caso extremo de que
mediante una gramtica de tipo1 puedan desaparecer cadenas de smbolo.
Gramtica y lenguaje
Reconocedor
Que genera
Autmatas lineal
TIPO 1
(Sensible al contexto)
Entre las gramticas no restringidas y la forma restringida de las gramticas
independientes al contexto, se pueden definir varias gramticas con diferentes
niveles de restriccin.
Existe una exacta correspondencia entre cada uno de estos tipos de
lenguajes y particulares arquitecturas de mquinas en el sentido que por cada
lenguaje tipo T hay una arquitectura de mquina A que reconoce el lenguaje A hay
un tipo T tal que todos los lenguajes reconocidos por A son de tipo T. La
correspondencia entre lenguajes y arquitectura son mostrados en la siguiente tabla:
Tipo Lenguajes
0
Recursivamente
Enumerables
Sensibles
Tipo
Mquina
de
Mquina
Turing
de
al Autmata
32
contexto
Lineal Acotado
Libres de contexto
Autmatas
Pila
Autmatas
Lenguajes
Finitos
Regulares
Expresiones
Regulares
Los cuatro tipos de gramticas.
de
Gramticas Ambiguas
Si una oracin en espaol tiene mas de un significado, se dice que es ambigua. Con
frecuencia tales oraciones pueden analizarse sintcticamente en mas de una forma.
La oracin:
El tiempo vuela como una flecha.
33
Puede interpretarse tiempo como sustantivo, vuela como verbo y una flecha,
como una frase adverbial. Esta interpretacin es un comentario acerca del rpido
paso del tiempo. Sin embargo, si "tiempo" se interpreta como adjetivo, "vuela" como
sustantivo, "como" como un verbo y flecha como un sujeto directo, la oracin se
convertira en un comentario acerca de la vida amorosa de alguna especie.
En forma similar, se asigna significado a las construcciones en los lenguaje de
programacin con base en sus sintaxis. Por consiguiente, preferimos que las
gramticas de los lenguajes de programacin describan programas sin ambigedad
alguna.
Una sentencia es ambigua si hay mas de una derivacin distinta. Si una
sentencia es ambigua, su rbol de anlisis sintctico no es nico; podemos
crear mas de un rbol sintctico para la misma sentencia.
Una gramtica se dice que es ambigua si hay dos o ms rboles de
derivacin distintos para la misma cadena.
Para ver lo anterior consideraremos esta gramtica. O lo que es lo mismo:
Es la gramtica que produce mas de una derivacin por la derecha o por la
izquierda para la misma frase
S SbS | ScS | a
Podemos derivar la cadena "abaca" de dos formas distintas como sigue:
S SbS SbScS SbSca Sbaca abaca
S ScS SbScS abScS abacS abaca
El rbol de derivacin para la derivacin 1 es el que se muestra en la Figura:
34
35
36
modo
de
ejemplo
considrese
la
siguiente
gramtica:
<lect> ::=READ(<lista_id)>
<lista_id> ::=id | <lista_id>,id
38
39
Programa
Sentencias
Sentencias'
Sentencia
Asignacin
Expresin
Expresin'
Termino
Termino'
Factor
|
|
Sentencias
Sentencia Sentencias'
Sentencias |
Asignacin ;
Id := Expresin
Termino Expresin'
+ Termino Expresin' |
Factor Termino'
* Factor Termino' |
( Expresin )
Id
Literal
40
41
E TE
E E
E +TE
T FT
T FT
T
T
F
E TE
E
T
F id
T *FT
F(E)
Anlisis
Se analizar la cadena siguiente:
id + id * id $
42
Paso 1
Inicialmente la pila contiene el smbolo de inicio de la gramtica precedido por el
delimitador "$", as que tenemos en la pila a "$E". Y en la entrada tenemos a la
cadena completa.
Paso Pila
Entrada
Salida
1
$E
id + id * id $
Paso 2
En la cima de la pila tenemos a "E" verificamos en la gramtica y tenemos que es un
no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = E por su
produccin la cual es TE'. Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' T", y la salida ser la produccin del no terminal "E".
Paso 3
En la cima de la pila tenemos a "T" verificamos en la gramtica y tenemos que es un
no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = T por su
produccin la cual es FT'. Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' T' F", y la salida ser la produccin del no terminal "T".
Paso 4
Como la cima de la pila esta X= F y este produce el smbolo de la cadena leda, se
sustituye por su produccin que es el terminal "id" y avanza el apuntador de entrada
al siguiente smbolo de la cadena, ahora tendremos en la pila "$ E' T' id", y la salida
ser la produccin de "F".
Paso 5
Como "id" es igual al smbolo de entrada actual se compara y se saca de la pila y
avanza el apuntador al siguiente smbolo de entrada.
Paso 6
En la cima de la pila tenemos a "T'" verificamos en la gramtica y tenemos que es un
no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = T' por su
produccin la cual es . Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' " "$ E' ", y la salida ser la produccin del no terminal "
T' ".
Paso 7
En la cima de la pila tenemos a " E' " verificamos en la gramtica y tenemos que es
un no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = E' por su
produccin la cual es +TE'. Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' T +" y la salida ser la produccin del no terminal " E' ".
Paso 8
Como "+" es igual al smbolo de entrada actual se compara y se saca de la pila y
avanza el apuntador al siguiente smbolo de entrada.
Paso 9
En la cima de la pila tenemos a " T " verificamos en la gramtica y tenemos que es
un no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = T por su
produccin la cual es FT'. Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' T' F" y la salida ser la produccin del no terminal " T ".
43
Paso 10
Como la cima de la pila esta X= F y este produce el smbolo de la cadena leda, se
sustituye por su produccin que es el terminal "id" y avanza el apuntador de entrada
al siguiente smbolo de la cadena, ahora tendremos en la pila "$ E' T' id", y la salida
ser la produccin de "F".
Paso 11
Como "id" es igual al smbolo de entrada actual se compara y se saca de la pila y
avanza el apuntador al siguiente smbolo de entrada.
Paso 12
En la cima de la pila tenemos a " T' " verificamos en la gramtica y tenemos que es
un no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = T' por su
produccin la cual es *FT'. Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E' T' F *" y la salida ser la produccin del no terminal " T' ".
Paso 13
Como "*" es igual al smbolo de entrada actual se compara y se saca de la pila y
avanza el apuntador al siguiente smbolo de entrada.
Paso 14
Como la cima de la pila esta X= F y este produce el smbolo de la cadena leda, se
sustituye por su produccin que es el terminal "id" y avanza el apuntador de entrada
al siguiente smbolo de la cadena, ahora tendremos en la pila "$ E' T' id", y la salida
ser la produccin de "F".
Paso 15
Como "id" es igual al smbolo de entrada actual se compara y se saca de la pila y
avanza el apuntador al siguiente smbolo de entrada.
Paso 16
En la cima de la pila tenemos a " T' " verificamos en la gramtica y tenemos que es
un no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = T' por su
produccin la cual es . Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E'" "$ E' " y la salida ser la produccin del no terminal " T'
".
Paso 17
En la cima de la pila tenemos a " E' " verificamos en la gramtica y tenemos que es
un no terminal, ocupamos la regla 3 del algoritmo, y reemplazamos X = E' por su
produccin la cual es . Introduciremos la produccin en el orden inverso, y
tendremos en la pila "$ E'" "$ E' " y la salida ser la produccin del no terminal " T'
".
Paso
Pila
Entrada
$E
id + id * id $
$ E' T
id + id * id $
Salida
E TE
44
$ E' T' F
id + id * id $
T FT
$ E' T' Id
id + id * id $
F id
$ E' T'
+ id * id $
$ E'
+ id * id $
$ E' T +
+ id * id $
E +TE
$ E' T
id * id $
$ E' T' F
id * id $
T FT
10
$ E' T' Id
id * id $
F id
11
$ E' T'
* id $
12
$ E' T' F *
* id $
13
$ E' T' F
id $
14
$ E' T' Id
id $
15
$ E' T'
16
$ E'
17
T *FT
F id
En la cima de la pila tenemos a " $ " y este es igual al smbolo ledo y a su vez es
igual al delimitador, entonces el analizador sintctico se detiene y anuncia el xito de
la realizacin del anlisis de la cadena.
45
46
47
id
>
>
>
>
>
*
(
<
<
<
<
<
<
<
<
<
>
>
>
id
>
>
>
Anlisis
Se analizar la cadena siguiente:
(x+y)
Pas
Relaci
Toke
Pila
R
o
n
n
0
<
( x+y)$
$(
<
x +y)$
$(x
>
y)$
$(E
y)$
$(E+
<
)$
$(E+y
>
$(E+
T
>
$(E
$(E)
>
$
$
Anlisis Sintctico LR.
49
construir una derivacin por la derecha (en ingls rightmost derivation) en orden
inverso, y la k por el nmero de smbolos de entrada de examen por anticipado
utilizados para tomar las decisiones del anlisis sintctico. Cuando sta se omite, se
asume que k es 1. Esta tcnica de anlisis sintctico resulta conveniente por varias
razones:
Se puede construir analizadores sintcticos LR para reconocer prcticamente
todas las construcciones de los lenguajes de programacin para los que se
pueden escribir gramticas libres de contexto.
El mtodo de anlisis sintctico LR es el mtodo de anlisis por
desplazamiento y reduccin sin retroceso ms general que se conoce y sin embargo
se puede aplicar tan eficientemente como los otros mtodos de desplazamiento y
reduccin.
La clase de gramticas que pueden analizarse con los mtodos LR es un
supraconjunto de la clase de gramticas que se puedan analizar con analizadores
sintcticos predictivos.
Un analizador sintctico predictivo LR puede detectar un error sintctico tan
pronto como sea posible hacerlo en un examen de izquierda a derecha de la
entrada.
El principal inconveniente del mtodo es que supone demasiado trabajo
construir un analizador sintctico LR a mano para una gramtica de un lenguaje de
programacin tpico. Se necesita una herramienta especializada: un generador de
analizadores sintcticos LR, por ejemplo YACC. Con este generador se puede
escribir una gramtica libre de contexto y el generador produce automticamente un
analizador sintctico para dicha gramtica .
50
indica una accin del analizador, y la funcin ir_a, que indica las transiciones entre
los estados.
Realizacin
Gramtica
EE+T
ET
TT*F
TF
F(E)
F id
Algoritmo
inicializar la pila al estado cero
agregar $ al final de la entrada
apuntar al
Accin
smbolo de
Estado
repetir
id
+
*
(
)
0
d5
d4
estado de
1
d6
la pila y
el smbolo
actual
accin
desplazar
ir_a
E T F
1 2 3
Aceptar
primer
la entrada
begin
sea s el
la cima de
a
de entrada
if
[s,a] =
# then
begin
51
Anlisis
2
3
4
5
6
d5
d5
d4
d5
d4
8
9
10
11
r2
r4
d7
r4
r6
r6
r2
r4
r2
r4
r6
r6
d4
d6
r1
r3
r5
d7
r3
r5
8 2 3
9 3
1
0
d11
r1
r3
r5
r1
r3
r5
Entrada Accin S a
id*(id+id)$
0 id
52
Entrada
Accin
53
(1) 0
id*(id+id)$
S5
id
(2) 0 id 5
*(id+id)$
R6
(3) 0 F 3
*(id+id)$
R4
(4) 0 T 2
*(id+id)$
S7
(5) 0 T 2 * 7
(id+id)$
S4
(6) 0 T 2 * 7 ( 4
id+id)$
S5
id
(7) 0 T 2 * 7 ( 4 id 5
+id)$
R6
(8) 0 T 2 * 7 ( 4 F 3
+id)$
R4
(9) 0 T 2 * 7 ( 4 T 2
+id)$
R2
(10) 0 T 2 * 7 ( 4 E 8
+id)$
S6
(11) 0 T 2 * 7 ( 4 E 8 + 6
)$
S5
id
(12) 0 T 2 * 7 ( 4 E 8 + 6 id 5
)$
R6
(13) 0 T 2 * 7 ( 4 E 8 + 6 F 3
)$
R4
(14) 0 T 2 * 7 ( 4 E 8 + 6 T 9
)$
R1
(15) 0 T 2 * 7 ( 4 E 8
)$
S11
(16) 0 T 2 * 7 ( 4 E 8 ) 11
R5
11
(17) 0 T 2 * 7 F 10
R3
10
(18) 0 T 2
R2
(19) 0 E 1
::=
::=
::=
::=
::=
<estado>
IF <expr> THEN <estado>
<var> := <expr>
<expr> + <var> | <var>
id
$
$
IF
IF
1
THEN := + id
1
54
IF <expr>
THEN
<var> :=
<expr> +
id
Tabla parcialmente llena para la gramatica dada.
El analizador sintctico utiliza la tpica pila S y la variable para el smbolo
entrante R. Aunque la estructura de la pila tiene una pequea diferencia; en lugar de
slo smbolos, se permitir que cadenas de smbolos aparezcan en la pila. Las
cadenas que aparezcan aqu sern cabezas (las cuales terminan en un smbolo
terminal) de las partes derechas de las reglas. Por ejemplo, si la pila convencional
en algn momento contiene:
$ IF <expr> THEN IF <expr> THEN <var>:=
La pila podra verse como:
<var>:=
IF <expr> THEN
IF <expr> THEN
$
Note que todo lo que se hace es mantener juntos todos esos smbolos; los
cuales sabemos, debern ser reducidos al mismo tiempo. Tambin se utilizar una
variable U, sta estar vaca o contendr el smbolo el cual la ltima frase ha sido
reducida. As, si la cadena parcial analizada hasta el momento es:
$ IF <expr> THEN IF <expr> THEN <var>:= <expr>
Entonces la pila se vera como arriba y <expr> estara en U.
El analizador sintctico usa la matriz como sigue. En cada paso el elemento
en la cima de la pila corresponde a algn rengln de la matriz, debido a que ambas
representan la cabeza (terminando en un smbolo terminal) de alguna parte derecha.
El smbolo terminal entrante determina una columna de la matriz. Estas dos juntas
determinan un elemento de la matriz el cual es el nmero de subrutina a ejecutar.
Esta subrutina ejecuta la reduccin necesaria o mete en la pila a R y obtiene el
siguiente smbolo de entrada.
Realizacin del Anlisis de Matriz de Transicin.
Para llevar a cabo el anlisis sintctico y al mismo tiempo construir la matriz,
se har uso de una pila S que en cuestin a su estructura es algo diferente a las ya
conocidas, ya que en estas podemos almacenar no nicamente smbolos sino
tambin cadenas de smbolos, stas cadenas sern las cabezas que definimos
como renglones de la matriz y tambin se hace uso de una variable (R) que
especificar el smbolo o los smbolos que puedan entrar a la pila.
Ejemplo: Podemos tener en X momento esta expresin dentro de la pila:
55
$
$
$
IF
IF <expr>
THEN
<var> :=
<expr> +
id
IF
1
THEN := + id
1
id
IF
$
U=
R=
56
IF
1
1
THEN := + id
1
1
1
1
1
como vemos ahora en la cima de la pila se encuentra el smbolo id, por lo que
iremos al rengln id de la matriz y analizaremos que smbolo (de las columnas)
puede ser vlido en R, es decir, que smbolo podra seguirle a id y vemos que los
smbolos $, THEN, := + son vlidos, esto es porque se puede tener una expresin
como la siguiente:
IF id THEN id:= id + id $
por lo tanto la matriz queda:
$
$
IF
IF <expr>
THEN
<var> :=
<expr> +
id
IF
1
1
THEN := + id
1
1
1
1
1
2 2 2
57
IF
$
'<expr>+'
U = ' <var> '
IF
R=
$
Ahora nos posicionamos en la fila <expr>+ de la matriz y analizaremos que
smbolo (de las columnas) puede ser vlido en R, es decir que smbolo podra seguir
a <expr>+ tomando en cuenta tambin a <var> que esta en U y vemos que los
smbolos $, THEN + son vlidos, porque se puede tener una expresin como la
siguiente:
IF <expr>+<var> THEN <var>:= <expr>+<var>+<var> $
<expr>
+<var>
THEN := + id
1
3 1
1
4
2
3 1
4 1
2 2 2
58
'<expr>+'
U = ' <var> ' := '<expr>'
IF
R=
$
Se hizo aqu otra reduccin.
Se siguen los mismos procedimientos, aunque cabe aclarar que en la
subrutina 5, se hace una parada.
Subrutina 5: IF U <> '<prog>' and U <> '<estado>' then ERROR;
STOP
de tal forma que as quedara la tabla:
$ IF THEN := + id
$
5 1
1
IF
3 1
IF <expr>
1
1
THEN
<var> :=
3 1
<expr> +
4
4
4 1
id
2
2
2 2 2
La matriz completa y las subrutinas para la gramtica de ejemplo se muestran a
continuacin:
$
IF
IF <expr>
THEN
<var> :=
<expr> +
id
$
5
0
7
IF
1
0
1
THEN
0
9
0
8
4
2
0
0
0
0
4
2
:=
6
0
6
+
0
3
0
0 3 1
0 4 1
2 2 0
6:
7:
8:
9:
id
1
1
1
59
ERROR;
STOP.
60
61