Vous êtes sur la page 1sur 43

M.A.S.C. Arturo Ivn Grajales Vzquez.

Competencia a desarrollar.

Construye un analizador sintctico a partir de un


lenguaje de programacin.
Subtemas.

5.1 Definicin y clasificacin de gramtica


5.2 GLC
5.3 rboles de derivacin.
5.4 Formas normales de Chomsky.
5.5 Diagramas de sintaxis
5.6 Eliminacin de la ambigedad.
5.7 Tipos de analizadores sintcticos
5.8 Generacin de matriz predictiva
5.9 Manejo de errores
5.10 Generadores de analizadores sintcticos
Introduccin al analizador
Sintctico
Analizador sintctico o gramatical ( Parsing )
El anlisis sintctico es ms complejo que el anlisis
lexicogrfico, El anlisis sintctico o fase gramatical de un
compilador, agrupa los tokens en estructuras sintcticas en forma
muy similar a como tenamos que estructurar las oracin en la
primaria.
El proceso de encontrar la estructura sintctica, la fase de
sintaxis tambin determina si la secuencia de tokens es
sintcticamente correcta, de acuerdo con la definicin del lenguaje.
Tal como los tokens puede consistir de uno o ms
caracteres, las categoras sintcticas pueden consistir de uno o ms
tokens.
La estructura reconocida por el anlisis sintctica se
describe en forma semejante a un rbol y es conocido como rbol
sintctico, rbol gramatical o rbol de estructura. No todos los
analizadores gramaticales producen una representacin de rbol en
forma explcita, pero la salida siempre puede utilizarse para crear
un rbol gramatical..
Estructura que muestra el sitio que ocupa el
analizador sintctico dentro del compilador.

Preparacin
Analizador Analizador Analizador Para la Generacin
Optimizacin
lexicogrfico sintctico semntico Generacin del cdigo
de cdigo

Tokens rbol de anlisis


gramatical

Manejo de tablas
Tabla de smbolo.
Tabla de literales.
Manejo
Tabla de ciclos de errores E/S
iterativos
Tabla de
representacin
intermedia
6.1. Gramtica Libre de Contexto
(GLC)
El lenguaje es el medio de comunicacin entre los seres
humanos a travs de signos orales y escritos que poseen un
significado. Para que exista el lenguaje se requieren ciertos
factores como la sintaxis, que da estructura al lenguaje y la
semntica, que le da significado al lenguaje. Adems de
manera conjunta con los lenguajes tenemos la gramtica que
estudia los elementos de un lenguaje y sus combinaciones. As
como es importante podernos comunicar con otras personas,
actualmente tambin es importante podernos comunicar con
las computadoras; es decir establecer un lenguaje y una
gramtica para facilitar el uso de las mismas.

Por Ejemplo: Supongamos que tenemos la siguiente frase.

La gata gris duerme en la cama diariamente


Observamos que la frase se divide en dos partes esenciales
sujeto y predicado; el sujeto a su vez se divide en articulo,
sustantivo y adjetivo; y el predicado se divide en verbo,
preposicin, articulo y adverbio. Nosotros podemos decir que
existe una variable llamada < frase > que genera 2 variables <
sujeto > y < predicado > es decir:

< frase >< sujeto >< predicado >

(sustituimos la palabra produce por la echa) a su vez las variables:

< sujeto >< articulo >< sustantivo >< adjetivo >


< predicado > < verbo >< preposicin >< articulo >< adverbio >

por ultimo las variables


< articulo > la | el
< sustantivo > gata | cama
< adjetivo > gris
< verbo > duerme
< preposicin > en
< adverbio > diariamente

a las variables la, el, gata, cama, gris, duerme, en, diariamente
las llamamos smbolos terminales, mientras que a las
variables escritas entre < > las conocemos como smbolos no
terminales; el proceso que sustituye unas variables por otras
se le conoce como produccin y a la variables < frase > se le
conoce como smbolo inicial.
De manera formal tenemos

Una Gramtica es una cudrupla G = (N, T, P, S)

donde:

N: es un alfabeto a cuyos smbolos llamamos no


terminales.
T: es un alfabeto a cuyos smbolos llamamos terminales.
P: la conocemos como producciones de G.
S: es el smbolo inicial.

Nota : A los smbolos no terminales se les representa


mediante letras maysculas, mientras que los smbolos
terminales sern representados mediante letras
minsculas.
Ejemplo:

G=({E},{(,),+,-,*,0,,9},{EE+E, EE*E, E(E), E-E, E0..9},E)

Notacin simplificada.
EE+E
EE*E
E(E)
E-E
E0..9
6.2. rbol de derivacin
Cuando trabajamos con un lenguaje de alto nivel en una
Computadora es necesario usar traductores que permitan a
la maquina interpretar las instrucciones que el usuario
programa; en los traductores de lenguajes se usan varios
estados de procesamiento.

Cuando las frases o instrucciones validas del lenguaje son


especiadas por una gramtica de estructura de frases, el
primer estado del proceso de traduccin construye un rbol
de derivacin para la frase dada; una vez que esta es clara
tendr asignado un nico rbol de derivacin para cada tipo
sintctico, de esta manera es posible asociar un significado
a cada frase de acuerdo con la gramtica de la misma. Al
anlisis anterior se le conoce con el nombre de anlisis de
sintaxis.
Cuando tenemos una gramtica independiente del contexto
es muy til presentar sus producciones mediante arboles de
derivacin; sus vrtices estn etiquetados con smbolos
terminales o variables de la gramtica.

Sea G = (N, T, P, S) una gramtica independiente del


contexto, un rbol se llama de derivacin (o de anlisis
gramatical) para G si:

1. Cada vrtice tiene una etiqueta que es un smbolo de N


U T U .
2. La etiqueta de la raz es S.
3. Si un vrtice es interior y tiene etiqueta A, entonces A
debe de estar en N.
4. Si el vrtice n tiene etiqueta A y los vrtices n1,n2, n3,
, nk son los hijos del vrtice, de izquierda a derecha
con etiquetas x1, x2, x3, ., xk respectivamente,
entonces A x1|x2|x3| . |xk debe ser una produccin
de P.

5. Si el vrtice n tiene etiqueta , entonces es una hoja y es


el unico hijo de su padre.

Por ejemplo la gramtica :

exp exp op exp


exp (exp)
exp numero
op + | - | *
numero digito digito*
digito 0 |1 |2 |3 |4 |5 |6 |7 |8 |9
rbol anlisis gramatical

Exp

Exp op Exp

numero numero

Un rbol de analisis gramatical correspondiente a una


derivacin es un rbol etiquetado el cual los nodos interiores
estn etiquetados por no terminales, los nodos hojas estn
etiquetados por terminales. Estos puede ser derivados por la
izquierda o por la derecha.
Derivacin por la izquierda.

Es aquella en la cual se reemplaza el no terminal mas a la


izquierda en cada paso en la derivacin.

Por ejemplo: dada la expresin 3+4

Aplicando la gramtica.

( 1 ) exp exp op exp


( 2 ) numero op exp 1 Exp
( 3 ) numero + exp
( 4 ) numero + numero
2 3 4
Exp op Exp

numero + numero
Derivacin por la derecha.

Es aquella en la cual el no terminal mas a la derecha se


reemplaza en cada paso de la derivacin.

Por ejemplo: dada la expresin 3+4

Aplicando la gramtica.

( 1 ) exp exp op exp


( 2 ) exp op numero 1 Exp
( 3 ) exp + numero
( 4 ) numero + numero
4 3 2
Exp op Exp

numero + numero
6.3. Formas normales de
Chomsky
Una gramtica formal esta en Forma normal de Chomsky si
todas sus reglas de produccin son de alguna de las siguientes
formas:

A BC
o
A

donde A, B y C son elementos del conjunto de smbolos no


terminales y es un smbolo terminal. Adems es importante
mencionar que todo lenguaje de programacin que no posee a
la cadena vacia, se puede expresar por medio de una gramtica
en la forma normal de Chomsky, y dada una gramtica
independiente del contexto es posible construir a partir de ella
una gramtica de Chomsky que reconozca el mismo lenguaje,
para lo cual necesitaremos realizar ciertos pasos:
1. Hay que eliminar los smbolos intiles: las variables o
smbolos terminales que no aparecen en ninguna
derivacin de una cadena terminal que parta del
smbolo inicial.
2. Hay que eliminar las producciones con la forma A
para alguna variable A.
3. Hay que eliminar las producciones unitarias de la forma
A B para las variables A y B
6.4. Diagramas de sintaxis
Las representaciones grficas para simbolizar de manera
visual las reglas EBNF(Forma extendida de Backus- Naur)
se denominan diagramas de sintaxis. Y se compone de :
Smbolo Descripcin
La caja representa no terminales.

La lneas con flechas simbolizan


secuencias y selecciones.

Las etiquetas de no terminales


Etiquetas para cada diagrama que
representa la regla gramatical
que define ese no terminal.

Los valos o crculos se utilizan


O para indicar terminales en un
diagrama.
Considere como ejemplo la regla gramatical :
factor -> ( exp ) | digito
sta se escribe como un diagrama sintctico de la
siguiente manera :

( exp ) ;
Factor
digito

exp exp Opera exp

digito
6.5. Eliminacin de ambigedad
Una GLC es ambigua si existe una cadena w L(G) que tiene
ms de una derivacin por la izquierda o ms de una
derivacin por la derecha o si tiene dos o ms rboles de
derivacin. En caso de que toda cadena w L(G) tenga un
nico rbol de derivacin, la gramtica no es ambigua.

Ejemplo: La gramtica S aS | Sa | a es ambigua porque aa


tiene dos derivaciones por la izquierda.

Esta gramtica genera el lenguaje a+ que tambin es el


lenguaje generado por la gramtica no ambigua S aS | a.
Eliminacin de ambigedad

1. No existe un algoritmo que nos indique si una GIC es


ambigua.
2. Existen LIC que slo tienen GIC ambiguas:
inherentemente ambiguos.
3. Para las construcciones de los lenguajes de
programacin comunes existen tcnicas para la
eliminacin de la ambigedad.

Ejemplo: causas de ambigedad en la siguiente gramtica

no se respeta la precedencia de operadores


una secuencia de operadores idnticos puede agruparse
desde la izquierda y desde la derecha. Lo convencional
es agrupar desde la izquierda
Ejemplo: modificamos la gramtica para forzar la precedencia
6.6. Tipos de analizadores
Sintcticos
Analizador Descendente

Se construye el rbol de anlisis sinttico partiendo del smbolo


inicial y aplicando las producciones mediante derivaciones por la
izquierda, el smbolo a expandir es el que esta mas a la izquierda.

Analizador Ascendente

Se construye el rbol de anlisis sinttico partiendo de la frase a


reconocer y aplicando las producciones mediante reducciones hasta
llegar al smbolo inicial de la gramtica.
6.7. Manejo de Errores
Un compilador es un sistema que en la mayora de los casos tiene
que manejar una entrada incorrecta. Sobre todo en las primeras
etapas de la creacin de un programa, es probable que el
compilador se utiliza para efectuar las caractersticas que debera
proporcionar un buen sistema de edicin dirigido por la sintaxis, es
decir, para determinar si las variables han sido declaradas antes de
usarla, o si faltan corchetes o algo as.

Por lo tanto, el manejo de errores es parte importante de un


compilador y el escritor del compilador siempre debe tener esto
presente durante su diseo.

Hay que sealar que los posibles errores ya deben estar


considerados al disear un lenguaje de programacin. Por ejemplo,
considerar si cada proposicin del lenguaje de programacin
comienza con una palabra clave diferente (excepto la proposicin
de asignacin, por supuesto). Sin embargo, es indispensable lo
siguiente:
El compilador debe ser capaz de detectar errores en la entrada;

El compilador debe recuperarse de los errores sin perder


demasiada informacin;
Y sobre todo, el compilador debe producir un mensaje de error
que permita al programador encontrar y corregir fcilmente los
elementos (sintcticamente) incorrectos de su programa.
Errores Sintctico

Muchos errores de naturaleza sintctica de recuperacin: Al


producirse un error el compilador debe ser capaz de informar del
error y seguir compilando. (Ideal).

El manejo de errores de sintaxis es el ms complicado desde el


punto de vista de la creacin de compiladores. Nos interesa que
cuando el compilador encuentre un error, se recupere y siga
buscando errores. Por lo tanto el manejador de errores de un
analizador sintctico debe tener como objetivos:

Indicar los errores de forma clara y precisa. Aclarar el tipo de


error y su localizacin.
Recuperarse del error, para poder seguir examinando la
entrada.
No para lentizar significativamente la compilacin.
Un buen compilador debe hacer siempre teniendo en mente los
errores que se pueden producir; con ello se consigue:

Simplificar la estructura del compilador.


Mejorar la respuesta ante los errores.
6.8.-Generadores de analizadores
Sintcticos
ANTLR.

(ANother Tool for Language Recognition; en espaol "otra


herramienta para reconocimiento de lenguajes") es una herramienta
creada principalmente por Terence Parr, que opera sobre lenguajes,
proporcionando un marco para construir reconocedores (parsers),
intrpretes, compiladores y traductores de lenguajes a partir de las
descripciones gramaticales de los mismos (conteniendo acciones
semnticas a realizarse en varios lenguajes de programacin).
GNU bison.

Es un programa generador de analizadores sintcticos de


propsito general perteneciente al proyecto GNU disponible para
prcticamente todos los sistemas operativos, se usa normalmente
acompaado de flex aunque los analizadores lxicos se pueden
tambin obtener de otras formas.

Grammatica.

Es un generador de analizadores sintcticos de C# y Java libre. Es


similar a otras herramientas como Yacc o ANTLR. Grammatica
soporta el algoritmo LL(k) para gramticas con un nmero ilimitado
de tokens de anticipacin. Est bastante bien probado, y ha sido
auto compilado desde la versin 0.1. La documentacin contiene
una lista completa de caractersticas, as como una comparacin
con otros generadores de analizadores.
JavaCC.

(Java Compiler Compiler) es un generador de analizadores sintcticos


de cdigo abierto para el lenguaje de programacin Java. JavaCC es
similar a Yacc en que genera un parser para una gramtica presentada
en notacin BNF, con la diferencia de que la salida es en cdigo Java.
A diferencia de Yacc, JavaCC genera analizadores descendentes (top-
down), lo que lo limita a la clase de gramticas LL (K) (en particular, la
recursin desde izquierda no se puede usar). El constructor de rboles
que lo acompaa, JJTree, construye rboles de abajo hacia arriba
(bottom-up).
Yacc.

Es un programa para generar analizadores sintcticos. Las siglas


del nombre significan Yet Another Compiler-Compiler, es decir,
"Otro generador de compiladores ms". Genera un analizador
sintctico (la parte de un compilador que comprueba que la
estructura del cdigo fuente se ajusta a la especificacin
sintctica del lenguaje) basado en una gramtica analticaescrita
en una notacin similar a la BNF. Yacc genera el cdigo para el
analizador sintctico en el Lenguaje de programacin C

Vous aimerez peut-être aussi