Algoritmo CYK

34
Universidad de Córdoba Escuela Politécnica Superior Ingeniería en Informática Métodos Universales de Análisis Sintáctico Algoritmo CYK Profesor: Nicolás Luis Fernández García 1

Transcript of Algoritmo CYK

Page 1: Algoritmo CYK

Universidad de CórdobaEscuela Politécnica SuperiorIngeniería en Informática

Métodos Universales de Análisis SintácticoAlgoritmo CYK

Profesor: Nicolás Luis Fernández García

Alumnos:Miguel Ángel Cid GarcíaCarlos García García

Fecha: 02/05/2011

1

Page 2: Algoritmo CYK
Page 3: Algoritmo CYK

INDICE DE CONTENIDOS

1. INTRODUCCIÓN____________________________________________________1

1.1. EL ANALIZADOR SINTÁCTICO_______________________________________________________11.2. EL ALGORITMO CYK______________________________________________________________3

1.2.1. Características______________________________________________________________3

2. DESCRIPCIÓN______________________________________________________5

2.1. PREPROCESO____________________________________________________________________52.2. IDEA BÁSICA DEL ALGORITMO CYK__________________________________________________62.4. PSEUDOCÓDIGO DEL ALGORITMO CYK_______________________________________________92.4. RECONSTRUCCIÓN DEL ÁRBOL SINTACTICO____________________________________________92.5. ALGORITMO CYK PREDICTIVO_____________________________________________________10

3. EJEMPLO__________________________________________________________11

3.1. RECONOCIMIENTO DE UNA CADENA_________________________________________________11

I

Page 4: Algoritmo CYK

INDICE DE TABLAS

Tabla 1.1 Ejemplo del método de selección de la Ruleta. ______________________ 47

Tabla 4.2 Ejemplo del método de selección de Jerarquías ______________________ 51

II

Page 5: Algoritmo CYK

INDICE DE ILUSTRACIONES

Figura 1.1: Distribución de una planta de usando curvas de llenado de espacios. _____ 5

III

Page 6: Algoritmo CYK

5

Page 7: Algoritmo CYK

__________1 Introducción_

1.1. El analizador sintáctico

Un analizador sintáctico (en inglés parser) es uno de los componentes más importante de un compilador el cual tiene como objetivo realizar un análisis sintáctico que convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis, y capturan la jerarquía implícita de la entrada. En otras palabras, el análisis sintáctico se puede considerar como una función que toma como entrada la secuencia de componentes léxicos producida por el análisis léxico y produce como salida el árbol sintáctico. En la realidad, el análisis sintáctico hace una petición al análisis léxico del componente léxico siguiente en la entrada (los símbolos terminales), a medida que lo va necesitando en el proceso de análisis, conforme se mueve a lo largo de la gramática.

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

Page 8: Algoritmo CYK

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.

Figura 1.1: Estructura de un analizador

Existen tres grandes clases de métodos de análisis sintáctico [1] que son los siguientes:

Métodos universales: como los algoritmos de Cocke-Younger-Kasami (CYK) y el método de Early son lo más conocidos, pueden analizar cualquier gramática pero son bastante ineficientes desde un punto de vista computacional.

Métodos de análisis descendente: se parte del símbolo de inicio de la gramática que se coloca en la raíz y se va construyendo el árbol desde arriba hacia abajo hasta las hojas, eligiendo la derivación que da lugar a una concordancia con la cadena de entrada. Se basa en la idea de predice una derivación y establece una concordancia con el símbolo de la entrada (predict/match). El análisis sintáctico descendente corresponde con un recorrido prefijo del árbol de análisis sintáctico(primero expandimos el nodo que visitamos y luego procesamos los hijos).

Métodos de análisis ascendente: se construye el árbol de análisis sintáctico desde las hojas hasta la raíz. En las hojas está la cadena a analizar y se intenta reducirla al símbolo de inicio de la gramática que está en la raíz. Se trata de desplazar-se en la cadena de entrada y encontrar una subcadena para aplicar una reducción (una regla de producción a la inversa), (shift-reduce). El análisis sintáctico ascendente corresponde con un recorrido postorden del árbol (primero reconocemos los hijos y luego mediante una reducción reconocemos el padre).

1.2. El algoritmo CYK

2

Page 9: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

Dentro de los métodos universales esta el algoritmo de Cocke-Younger-Kasami (CYK) para análisis sintáctico de gramáticas independientes del contexto en forma normal de Chomsky (FNC)  fue descubierto por J. Cocke[1], pero fue publicado independientemente por Younger [3] y Kasami [2], de ahí su nombre. Es un método universal de análisis sintáctico que determina si una cadena puede ser generada por una gramática libre de contexto y, si es posible, cómo puede ser generada. Este proceso es conocido como análisis sintáctico de la cadena. El algoritmo es un ejemplo de programación dinámica.

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:

Es aplicable a cualquier gramática de contexto libre. En el caso de que la gramática no sea de contexto libre se puede transformar para que cumpla este requisito. Por lo cual, es aplicable si interesan todos los árboles de derivación posibles (G. ambiguas)

Es un método de análisis universal pero existen versiones de análisis descendente y ascendentes sobre este algoritmo.

Es un método tabular, es decir, está basado en tablas.

Utiliza  técnicas de programación dinámica.

El problema se divide en subproblemas que son tratados de forma independiente.

Las soluciones a dichos subproblemas se combinan para obtener la solución al problema inicial.

Simula de forma eficiente una búsqueda paralela de la estructura de análisis.

3

Page 10: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

No son aplicables para lenguajes de programación convencionales.

Tiene poca aplicabilidad, ya que son bastante ineficientes.

Tiene complejidad espacial proporcional a Θ(n2).

En el peor caso asintótico la complejidad temporal de CYK es de Θ(n3), donde n es la longitud de la cadena analizada. Esto hace a éste algoritmo uno de los más eficientes (en estos términos) en el reconocimiento de los lenguajes libres de contexto. Sin embargo, existen otros algoritmos con un mejor funcionamiento para ciertos subconjuntos de los lenguajes libres de contexto.

4

Page 11: Algoritmo CYK

___________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__

donde A, B y C son símbolos no terminales, y donde a es un símbolo terminal. Las reglas que inicialmente, no tengan uno de estos formatos habrá que transformarlas, mediante el algoritmo que se muestra en la figura. Hay que dejar claro, que no todas las gramáticas, pueden ser puestas en FNC sin cadena vacía y sin eliminar reglas unitarias del tipo A ->B.

Es obvio, que esta conversión multiplicará el número de reglas aplicables, lo cual no lleva consigo un ‘parsing’ linealmente más lento, ya que las reglas serán muchas más pero su uso será mucho más sencillo, sin necesidad de recorrer los símbolos de su parte derecha ya que sólo tiene dos. Eso sí, es necesario ordenar las reglas por su parte derecha, y guardar con cada símbolo, cuál es la primera regla que contiene dicho símbolo como primero en su parte derecha (si no, la velocidad dependen directamente

5

Page 12: Algoritmo CYK

del número medio de reglas, multiplicándose por veinte o treinta el tiempo de reconocimiento de una frase).

Figura 2.1: Algoritmo que pasa una gramática en formato FNC

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.

Los símbolos generados durante el proceso de transformación de las reglas serán, totalmente transparentes al usuario, no apareciendo en los árboles, ni en pantalla.

2.2. Idea básica del algoritmo CYK

La idea del algoritmo es explorar todas las posibles formas de derivar la palabra, para demostrar que puede ser reconocida por la gramática. Para ello, se parte de una gramática en FNC, ya que esta tiene mejores propiedades a la hora de calcular la eficiencia, y de una cadena.

Como antes se ha mencionado, los datos de entrada del algoritmo son los siguientes:

6

Page 13: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

Gramática G = (Vn, VT, P, S) en FNC

Una cadena w = a1a2 …an cuya pertenencia a L(G) se quiere reconocer

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}

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

7

Page 14: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

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:

Para la celda chart[i,j], mirar las posibles combinaciones de chart[i, k] y chart [k+1, j], donde i indica la fila, j la columna y k un valor comprendido ente i ≤ k ≤ j

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].

Figura 2.2: Introducción de una regla en una celda de la tabla chart

El algoritmo reconocerá la cadena en el caso que en la celda superior izquierda de la tabla se obtenga el axioma. Un adecuado ordenamiento de las reglas y de los símbolos equivalentes (o un preprocesamiento de los mismos en forma de nuevas reglas) permite acelerar el proceso.

2.4. Pseudocódigo del algoritmo CYK

8

Page 15: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

El siguiente pseudocódigo simula el algoritmo CYK estándar, el cual se ha definido en el apartado anterior, de la forma más clara posible.

2.4.1. Extensión del algoritmo para reconstruir del árbol sintáctico

Es fácil extender el algoritmo para que no sólo determine si una frase pertenece a un lenguaje, sino que también construya un árbol sintáctico, guardando los nodos del árbol como elementos de un array, en vez de como booleanos. Puesto que las gramáticas pueden ser ambiguas, es necesario guardar una lista de nodos para cada uno de los posibles árboles sintácticos. Así, el resultado final es un bosque con todos los posibles árboles sintácticos.

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.

La reconstrucción de todos los árboles de análisis posibles (o secuencias de reglas aplicables para construir la cadena de entrada), requiere recursión múltiple, dado que además de invertir el proceso de análisis (el backtraking típico de los procesos basados en programación dinámica como es CYK), debemos multiplicar el número de árboles cada vez que detectamos una ambigüedad (dos maneras distintas de rellenar una misma casilla de análisis).

El siguiente pseudocódigo simula la reconstrucción del árbol sintáctico.

9

Page 16: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

2.5. Algoritmo CYK predictivo

También sería especialmente interesante, que se dispusiera de un algoritmo con el que fuese posible predecir, tras haber aplicado todas las reglas a cada palabra que se va leyendo, y a la combinación de ésta con las que la preceden, cuáles son las posibles siguientes.

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

Page 17: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

El procedimiento anterior sería el que está desarrollado e integrando en el procedimiento de CYK y se tendría como resultado el algoritmo del cuadro.

11

Page 18: Algoritmo CYK

______________3 Ejemplo_

3.1. Reconocimiento de una cadena

Tenemos el siguiente conjunto de producciones de una gramática que genera la llamada a una función:

P = {S -> DSS -> ƐD -> T id(P);T -> intP -> TLP -> ƐL -> ,TLL -> Ɛ}

Lo primero que debemos hacer es poner la gramática en FNC, para ello aplicaremos lo siguiente pasos:

- Eliminación de las producciones épsilon- Eliminación de las reglas unitarias- Conversión a la gramática FNC

1. Eliminación de las producciones epsilon

13

Page 19: Algoritmo CYK

Para eliminar las producciones épsilon se duplicaran las reglas que contienen epsilon, quedando de la siguiente manera:

P = {S -> D S -> DSD -> T id();D -> T id(P);T -> intP -> TP -> TLL -> ,TL -> ,TL}

2. Eliminación de las reglas unitarias

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 -> DSD -> T id();D -> T id(P);T -> intP -> intP -> TLL -> ,TL -> ,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();

14

Page 20: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

S -> T id(P); S -> SST -> intP -> intP -> TLL -> ,TL -> ,TL}

3. Conversión a la gramática a FNC

Para convertir la gramática a la FNC, primero se pasa los símbolos terminales a una regla unitaria, quedando la gramática de cómo se muestra.

P = {S -> TABCDS -> TABPCDS -> SSA -> idB -> (C -> )D -> ;T -> intP -> intP -> TLL -> ETL -> ETLE -> ,}

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.

15

Page 21: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

P = {S -> TSI

SI-> ASII

SII -> BSIII

SII -> BSIV

SIII -> CDSIV -> PSIII

S -> SSA -> idB -> (C -> )D -> ;T -> intP -> intP -> TLL -> ETL -> EPE -> ,}

La cadena que se quiere que sea reconocida por el algoritmo es la siguiente:

int h(int,int);

16

Page 22: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

Para empezar a realizar el algoritmo, primero se pondrán los símbolos terminales a modo de referencia y en la diagonal se podrán las reglas unitarias que llevan a esos símbolos terminales.

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}

Después de rellenar la diagonal principal de la tabla se pasa a rellenar el resto de celdas. Si se sigue la idea que se ha expuesto, a continuación se pasará a rellenar la tabla como anteriormente se especifico. La primera celda que se rellena de la tabla es chart(5, 6), la combinación de la celda chart(5, 5) y chart(6, 6) produce la regla L -> ET y L ->EP. Aplicando esta regla, la tabla se queda como se muestra a continuación.

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}

17

Page 23: Algoritmo CYK

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

1 int {T,P} {S}

2 h {A} {SI}

3 ( {B} {SII}

4 int {T,P} {P} {SIV}

5 , {E} {L}

6 int {T,P} {SIV}

7 ) {C} {SIII}

8 ; {D}

Luego el algoritmo se sitúa en la celda chart(7,8) y con la única combinación posible produce la regla SIII ->CD.

0 1 2 3 4 5 6 7 8

1 int {T,P}

2 h {A}

3 ( {B}

4 int {T,P} {P}

5 , {E} {L}

6 int {T,P}

7 ) {C} {SIII}

8 ; {D}

A continuación, las celdas chart(6, 8) y chart(4, 8) se rellenan de la misma forma pero de forma sucesiva. En ella se coloca el símbolo no terminal SIV producido por la unión de los símbolos no terminales P y SIII .

18

Page 24: Algoritmo CYK

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} {P} {SIV}

5 , {E} {L}

6 int {T,P} {SIV}

7 ) {C} {SIII}

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}

4 int {T,P} {P} {SIV}

5 , {E} {L}

6 int {T,P} {SIV}

7 ) {C} {SIII}

8 ; {D}

La celda chart(2, 8) es la siguiente que pasa a ser rellenada. En ella se colocará el símbolo no terminal SI, esto viene dado por la combinación de la celda chart(2, 2) y chart(3, 8), es decir, la unión de A y SII produce la regla que lleva al símbolo SI.

19

Page 25: Algoritmo CYK

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}

4 int {T,P} {P} {SIV}

5 , {E} {L}

6 int {T,P} {SIV}

7 ) {C} {SIII}

8 ; {D}

Para terminar el análisis, se realiza las posibles combinaciones de la celda chart(1,8), en ella se debería de obtener el axioma. Como se muestra en la tabla, finalmente si se consigue el símbolo S (axioma), este viene dado por la unión de la celda chart (1,1) y chart (2,8)

0 1 2 3 4 5 6 7 8

1 int {T,P} {S}

2 h {A} {SI}

3 ( {B} {SII}

4 int {T,P} {P} {SIV}

5 , {E} {L}

6 int {T,P} {SIV}

7 ) {C} {SIII}

8 ; {D}

Como se ha podido comprobar, el algoritmo si es capaz de reconocer la cadena de entrada que se ha introducido en el compilador.

Otro ejemplo

20

Page 26: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

Este es un ejemplo sencillo del uso del algoritmo de Chomsky sobre una gramática que está en la FNC.

P = {S -> AB A -> CDA -> CFB -> EBF -> ADB -> c C -> aD -> bE -> c}

Si se quiere reconocer la cadena aaabbbcc, el algoritmo rellenará la tabla de la siguiente manera.

Bibliografía

21

Page 27: Algoritmo CYK

Métodos Universales de Análisis Sintáctico: Algoritmo CYK

[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=iDgwaKVdmPF9y0xOsAL2r5CCfBI&hl=es&ei=EC2kTZflHIO1hAeO1vjLCQ&sa=X&oi=book_result&ct=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.

[4]    Daniel H. Younger (1967). Recognition and parsing of context-free languages in time n3. Information and Control 10(2): 189–208.

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 Java: http://www.marco-maniscalco.de/?p=229

Ejemplo: http://www.diotavelli.net/people/void/demos/cky.html

22