Algoritmo CYK
Algoritmo CYK
Algoritmo CYK
Métodos Universales de
Análisis Sintáctico
Algoritmo CYK
Profesor:
Nicolás Luis Fernández García
Alumnos:
Miguel Ángel Cid García
Carlos García García
Fecha:
02/05/2011
1
INDICE DE CONTENIDOS
1. INTRODUCCIÓN____________________________________________________1
1.1. EL ANALIZADOR SINTÁCTICO_______________________________________________________1
1.2. EL ALGORITMO CYK______________________________________________________________3
1.2.1. Características______________________________________________________________3
2. DESCRIPCIÓN______________________________________________________5
2.1. PREPROCESO____________________________________________________________________5
2.2. IDEA BÁSICA DEL ALGORITMO CYK__________________________________________________6
2.4. PSEUDOCÓDIGO DEL ALGORITMO CYK_______________________________________________9
2.4. RECONSTRUCCIÓN DEL ÁRBOL SINTACTICO____________________________________________9
2.5. ALGORITMO CYK PREDICTIVO_____________________________________________________10
3. EJEMPLO__________________________________________________________11
3.1. RECONOCIMIENTO DE UNA CADENA_________________________________________________11
I
INDICE DE TABLAS
II
INDICE DE ILUSTRACIONES
Figura 1.1: Distribución de una planta de usando curvas de llenado de espacios. _____ 5
III
5
__________1 Introducción_
1.1. El analizador sintáctico
Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los
lenguajes libres de contexto. Cabe notar que existe una justificación formal que
establece que los lenguajes libres de contexto son aquellos reconocibles por un autómata
de pila, de modo que todo analizador sintáctico que reconozca un lenguaje libre de
contexto es equivalente en capacidad computacional a un autómata de pila.
Los analizadores sintácticos fueron extensivamente estudiados durante los años 70,
detectándose numerosos patrones de funcionamiento en ellos, cosa que permitió la
creación de programas generadores de analizadores sintéticos a partir de una
especificación de la sintaxis del lenguaje en forma Backus-Naur por ejemplo, tales y
1
como Yacc, GNU Bison y JavaCC. Estos lenguajes de programación tienden a basarse
en gramáticas libres de contexto, debido a que se pueden escribir analizadores rápidos y
eficientes para éstas.
Existen tres grandes clases de métodos de análisis sintáctico [1] que son los siguientes:
La versión estándar de CYK reconoce lenguajes definidos por una gramática libre de
contexto escrita en la FNC. Cualquier gramática libre de contexto puede ser convertida
a FNC sin mucha dificultad, CYK puede usarse para reconocer cualquier lenguaje libre
de contexto. Es posible extender el algoritmo CYK para que trabaje sobre algunas
gramáticas libre de contexto no escritas en FNC. Esto puede hacerse para mejorar la
ejecución, aunque hace el algoritmo más difícil de entender.
1.2.1. Características
Las principales características del algoritmo de CYK que definen este algoritmo se
muestra a continuación:
3
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
4
___________2 Descripción_
2.1. Preproceso
Para usar este algoritmo CYK, en cualquiera de sus formas, las reglas de
la gramática de contexto libre que tengamos, son necesarias transformarlas en
FNC sin cadena vacía. Para ello, las reglas deben tener uno de los dos siguientes
formatos:
A -> B C
A -> a__
5
del número medio de reglas, multiplicándose por veinte o treinta el tiempo de
reconocimiento de una frase).
Como las reglas de los dos tipos permitidos, no se aplican conjuntamente, una extensión
regular de las reglas originales (las que permiten paréntesis...) disminuye el número de
reglas en FNC creadas.
Como antes se ha mencionado, los datos de entrada del algoritmo son los siguientes:
La versión original de este algoritmo hace uso de una tabla bidimensional triangular,
que recibe el nombre de ‘chart’, la cual contiene las posiciones de la cadena de entrada
donde se almacena los resultados parciales obtenidos. Para rellenar la tabla, se colocará
los símbolos no terminales que pueden generar dicha letra o símbolo terminal (Reglas
del tipo A->a). De esta manera, para una cadena o palabra de entrada formada por 6
letras, la tabla chart tomará la siguiente forma:
0 1 2 3 4 5 6
1 a1 {A}
2 a2 {A}
3 a3 {A}
4 a4 {C}
5 a5 {C}
6 a6 {C,B
}
Primero, se aplicaran las reglas que llevan a los símbolos terminales. Estos, como se
muestra en la tabla, se colocaran en las celdas chart[n,n-1], donde es n va desde 1 a 6.
Los símbolos no terminales que los generan se ubicarán en la diagonal de la tabla, es
decir, en las celdas chart[n,n]. Como se ilustra, puede suceder que en una gramática
pueda haber reglas de producción que genere el mismo símbolo terminal, entonces para
dicho caso tan solo hay que colocar el conjunto de símbolos no terminales en la celda
correspondiente. Para la generación de las celdas restante, se irá rellenando las celdas
desde la columna la derecha hacia la izquierda y desde abajo hacia arriba. La siguiente
tabla muestra el orden para la tabla chart del ejemplo anterior.
0 1 2 3 4 5 6
1 a1 {A} 1 3 6 10 15
2 a2 {A} 2 5 9 14
3 a3 {A} 4 8 13
4 a4 {C} 7 12
5 a5 {C} 11
6 a6 {C,B
}
7
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
En estas celdas de la tabla se realizarán las posibles combinaciones para ver si alguna
genera alguna regla de producción contenida en la gramática, aplicando tan solo las
reglas de producción del tipo A -> CB. Las celdas que se deben mirar para las posibles
combinaciones dependen de la celda en que se esté trabajando y sigue este paso:
Hay que tener en cuenta que si en alguna de las celdas tiene un conjunto de símbolos
no terminales habrá que realizar la combinación de cada uno de los símbolos con el
símbolo de la otra celda. También, es importante mencionar que el orden establecido en
este paso no puede ser alterado, por ejemplo, si en la celda chart[i, k] = {C} y en la
celda chart[k+1, j] = {C,B}, las combinaciones serán CB y CC, dando lugar, la primera
combinación, a introducir en la celda chart[i, j] = {A}, pero no generará la combinación
BC ya que no este no es el orden preestablecido. Por último, para una misma celda
siempre se dará el caso de que tomará un valor ya que de todas las combinaciones que
se han hecho para esa celda solo se podrá aplicar una regla para la cadena que se está
reconociendo. La siguiente figura, muestra las posibles combinaciones de los símbolos
no terminales para la celda chart[1,6].
8
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
Este proceso se desarrollará para cada árbol sintáctico a partir del axioma, es decir, que
va a desarrollar los árboles sintácticos de aquellas cadenas que pertenecen al lenguaje.
Este análisis se llevará a cabo deshaciendo las reducciones, esto es, siguiendo el camino
opuesto al de reconocimiento. Al crear todos los posibles árboles, podremos ver todos
los caminos que llevan al análisis de la cadena.
9
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
Para ello, es necesario precompilar la gramática, y saber para cada símbolo no terminal
de la gramática en FNC, cuáles son los símbolos terminales que los pueden encabezar.
El procedimiento para la predicción de símbolos se muestra a continuación.
10
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
11
______________3 Ejemplo_
3.1. Reconocimiento de una cadena
P={
S -> DS
S -> Ɛ
13
D -> T id(P);
T -> int
P -> TL
P -> Ɛ
L -> ,TL
L -> Ɛ
}
Lo primero que debemos hacer es poner la gramática en FNC, para ello aplicaremos lo
siguiente pasos:
Para eliminar las producciones épsilon se duplicaran las reglas que contienen
epsilon, quedando de la siguiente manera:
P={
S -> D
S -> DS
D -> T id();
D -> T id(P);
T -> int
P -> T
P -> TL
L -> ,T
L -> ,TL
}
Después de limpiar la gramática para que no queden reglas ninguna regla épsilon
se pasará a eliminar las reglas unitarias (A ->B), para poder realizar esta eliminación
sustituirá el símbolo terminal por la regla a las que deriva. A continuación se muestra la
gramática después de realizar este paso.
P={
S -> T id();
S -> T id(P);
S -> DS
D -> T id();
D -> T id(P);
14
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
T -> int
P -> int
P -> TL
L -> ,T
L -> ,TL
}
Como se puede apreciar esto produce aumento el número de reglas de producción, para
simplificar aun más y que quede la gramática más simple, se puede eliminar la reglas
producidas por el símbolo no terminal D, ya que las reglas que produce este está
contenido dentro del axioma S. Al aplicar esta simplificación la gramática quedaría de
la siguiente manera.
P={
S -> T id();
S -> T id(P);
S -> SS
T -> int
P -> int
P -> TL
L -> ,T
L -> ,TL
}
P={
S -> TABCD
S -> TABPCD
S -> SS
A -> id
B -> (
C -> )
D -> ;
T -> int
P -> int
P -> TL
L -> ET
L -> ETL
E -> ,
15
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
Finalmente se transforma las reglas que contengas más de dos símbolos terminales. La
gramática en FNC que se obtiene es la siguiente.
16
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
P={
S -> TSI
SI-> ASII
SII -> BSIII
SII -> BSIV
SIII -> CD
SIV -> PSIII
S -> SS
A -> id
B -> (
C -> )
D -> ;
T -> int
P -> int
P -> TL
L -> ET
L -> EP
E -> ,
}
int h(int,int);
17
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A}
3 ( {B}
4 int {T,P
}
5 , {E}
6 int {T,P
}
7 ) {C}
8 ; {D}
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A}
3 ( {B}
4 int {T,P
}
5 , {E} {L}
6 int {T,P
}
7 ) {C}
8 ; {D}
18
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
La siguiente celda en la que se obtiene una regla de producción es chart (4, 6). La
combinación viene dada por las celdas chart(4, 4) y chart(5, 6) y produce la regla P ->
TL Entonces en esta celda se coloca el conjunto formado por P.
0 1 2 3 4 5 6 7 8
3 ( {B} {SII}
8 ; {D}
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A}
3 ( {B}
6 int {T,P
}
7 ) {C} {SIII}
8 ; {D}
19
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A}
3 ( {B}
8 ; {D}
La siguiente celda a rellenar es chart(3, 8) que viene dada por la unión de las celdas
chart(3,3) y chart(4,8). Esta unión produce la regla SII -> BSIV, por lo tanto colocamos
en dicha celda el símbolo no terminal SII.
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A}
3 ( {B} {SII}
8 ; {D}
20
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
0 1 2 3 4 5 6 7 8
1 int {T,P
}
2 h {A} {SI}
3 ( {B} {SII}
8 ; {D}
0 1 2 3 4 5 6 7 8
3 ( {B} {SII}
8 ; {D}
21
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
Otro ejemplo
Este es un ejemplo sencillo del uso del algoritmo de Chomsky sobre una
gramática que está en la FNC.
P={
S -> AB
A -> CD
A -> CF
B -> EB
F -> AD
B -> c
C -> a
D -> b
E -> c
}
22
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
Bibliografía
[1] Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman(1990): Compiladores, Principios,
Técnicas Y Herramientas. Pearson Educación, Stanford University. ISBN:
9684443331. http://books.google.es/books?
id=yG6qJBAnE9UC&pg=PA164&lpg=PA164&dq=M
%C3%A9todos+universales+de+an%C3%A1lisis+Sint
%C3%A1ctico.&source=bl&ots=rrVJTV8ZmN&sig=iDgwaKVdmPF9y0xOsA
L2r5CCfBI&hl=es&ei=EC2kTZflHIO1hAeO1vjLCQ&sa=X&oi=book_result&c
t=result&resnum=1&ved=0CBgQ6AEwAA#v=onepage&q=M%C3%A9todos
%20universales%20de%20an%C3%A1lisis%20Sint%C3%A1ctico.&f=false
[2] John Cocke and Jacob T. Schwartz (1970). Programming languages and their
compilers: Preliminary notes. Technical report, Courant Institute of
Mathematical Sciences, New York University.
[3] T. Kasami (1965). An efficient recognition and syntax-analysis algorithm for
context-free languages. Scientific report AFCRL-65-758, Air Force Cambridge
Research Lab, Bedford, MA.
http://ants.dif.um.es/staff/juanbot/traductores/files/20022003/tema3.pdf
http://lorien.die.upm.es/juancho/pfcs/DPF/capitulo5.pdf
http://ocw.unican.es/ensenanzas-tecnicas/teoria-de-automatas-y-lenguajes-
formales/material-de-clase-nuevo/nuevo/4-4CYK.pdf
http://coleweb.dc.fi.udc.es/cole/library/ps/Alo2000a_B.pdf
http://www.ecst.csuchico.edu/~juliano/Computing/CYKalgorithm.pdf
http://jones.ling.indiana.edu/~mdickinson/09/645/slides/10-parsing/10a-cyk-2x3.pdf
Ejemplo: http://www.diotavelli.net/people/void/demos/cky.html
23
Métodos Universales de Análisis Sintáctico: Algoritmo CYK
24