INTRODUCCIÓN A BNF. Como se ha informado al comienzo de este capítulo, los lenguajes regulares tienen gran importancia en el diseño de los lenguajes de programación ya que los componentes básicos de un LP constituyen LRs. Esto es: los identificadores (LR infinito), las palabras reservadas (LR finito), las constantes enteras y las constantes reales (LRs infinitos), los operadores (LR finito) y los caracteres de puntuación (LR finito) son diferentes lenguajes regulares que forman parte de la sintaxis de un LP. Descripción sintáctica en BNF de componentes básicos En 1958 se publicó un informe preliminar sobre el lenguaje ALGOL (Algorithmic Language), un LP que, con los años, serviría de base para el desarrollo de muchos de los LPs que se conocen desde hace casi 40 años hasta la actualidad: Pascal, ANSI C, y luego C++, Java, etc. Con el Manual de Referencia del ALGOL se publicó, por primera vez, una descripción formal de la sintaxis de un LP. Esta descripción, basada en las GICs (revise el capítulo anterior), se llamaría luego BNF (Backus Normal Form, Forma Normal de Backus). La notación BNF consiste en un conjunto de reglas que definen, con absoluta precisión, la sintaxis de los componentes del LP en cuestión. Como dice el informe revisado de 1963 [Communications of the ACM, John W. Backus editor]: “La sintaxis será descripta con la ayuda de fórmulas metalingüísticas.” Cada regla (o producción) en este BNF se forma con: no terminales (o variables o categorías sintácticas), que son palabras o frases encerradas entre corchetes angulares (ejemplo: ) terminales, que son los caracteres o palabras del alfabeto sobre el cual se construye el LP descripto meta símbolos, que ayudan a escribir estas reglas (ejemplo: < >) CHOMSKY OBJETIVO Comprender la manera en que podemos convertir una gramática independiente del contexto a una gramática de la Forma Normal de Chomsky. JUSTIFICACIÓN Las gramáticas tienen ciertas similitudes, pero cuando no es así es necesario realizar una serie de pasos los cuales nos permitan obtener dos gramáticas diferentes y que lleguen al mismo resultado. INTRODUCCIÓN Las gramáticas se pueden expresar de diferentes formas, en ocasiones podemos llegar al mismo resultado utilizando gramáticas que difieren en su estructura, una norma para estandarizar las gramáticas es la Forma Normal de Chomsky. CONTENIDO Si L es un lenguaje independiente del contexto que no contiene la cadena vacía, entonces existe una gramática G independiente del contexto tal que L(G)=L y el lado derecho de cualquier regla de rescritura en G consiste en un solo terminal o exactamente dos no terminales. Se dice que una gramática cuyas reglas de rescritura se adhieren a las restricciones del teorema 2.4 tiene la FORMA NORMAL DE CHOMSKY (FNC o CNF), llamada así en honor a Noam Chomsky. Por ejemplo la siguiente gramática cuyo símbolo inicial es S tiene la forma normal de Chomsky. S ----------- XM M ---------- SY X ----------- x Y ----------- y Una gramática libre de contexto G=(V,T,P,S) se dice estar en forma normal de Chomsky si sus producciones son de cualquiera de las dos formas con , o bien con y . Toda gramática libre de contexto G=(V,T,P,S) que no genere a la palabra vacía se puede transformar en una gramática libre de contexto G'=(V',T,P',S') en forma normal de Chomsky. En efecto, dada una gramática G, apliquemos el último procedimiento de la sección anterior para transformar a G en una gramática G'' sin variables inútiles ni producciones vacías ni producciones unitarias equivalente a G. A las producciones que quedasen de la forma con y las dejamos sin cambio alguno. A cada producción de la forma, con y, la transformamos en una sucesión de producciones de la forma siguiente: A cada símbolo terminal que aparezca en la palabra le asociamos una variable nueva Xa e incorporamos la producción. Así pues las producciones que no sean de la forma con X variable y a terminal, han de ser de la forma, con todos variables. FORMA NORMAL DE GREIBACH Una gramática libre de contexto G=(V,T,P,S) se dice estar en forma normal de Greibach si sus producciones son de la forma Veremos que la construcción de formas normales de Greibach equivalentes gramáticas dadas es procedimental. Para cualquier gramática libre de contexto G, definamos, para cada variable, a los conjuntos siguientes: Primeramente observemos que podemos ``componer producciones'' de manera que tengamos siempre una gramática equivalente a la gramática dada. (Composición de producciones) Si es una producción en G y las producciones en P(Y) pueden escribirse como entonces al sustituir por las producciones , obtenemos una gramática equivalente a G. En efecto, en toda derivación terminal que aplique en un momento la producción , necesariamente se ha de aplicar una producción en P(Y) para suprimir el símbolo Y. (Transformación de producciones ``reflexivas'') Para cada variable enumeremos Q(X) y R(X) como Sea Z una variable que no ocurra en V. Sea La gramática que se obtiene al sustituir el conjunto de producciones P(X) por las producciones En efecto, toda derivación siniestra, en la gramática original, de una palabra en L(G)ha de determinar una derivación diestra de la misma palabra en la gramática transformada. La demostración de la afirmación anterior es directa. Como mera ilustración, consideremos tan solo un ejemplo: La gramática con producciones genera al lenguaje consistente de las palabras de la forma b(ab)*. De acuerdo con la construcción anterior, como y , obtenemos la gramática. Presentemos sendas derivaciones, siniestra en la gramática original y diestra en la transformada, para la palabra bababab: Toda gramática libre de contexto G=(V,T,P,S) que no genere a la palabra vacía se puede transformar en una gramática libre de contexto G*=(V*,T,P*,S*) en forma normal de Greibach. Sea pues G=(V,T,P,S) una gramática libre de contexto que no genere a . La transformación a una forma normal de Greibach la hacemos gradualmente mediante los pasos siguientes: 1. Sea G'=(V',T,P',S') la forma normal de Chomsky de G. 2. Modificaremos a las producciones en P' para tenerlas tales que toda producción, cuyo consecuente se inicie con una variable, ha de ser de la forma con j>i, para un cierto orden en el conjunto de variables actuales, digamos Por lo visto la gramática G'' así obtenida es equivalente a G. 3.Ahora, hecha la transformación anterior, se tiene que la última variable Xm sólo puede ser antecedente de producciones cuyos consecuentes se inician con símbolos terminales, las producciones en P(Xm-1) cuyos consecuentes se inician con Xmpueden transformarse, siguiendo el lema de ``Composición deproducciones'', en producciones equivalentes cuyos consecuentes seinician con símbolos terminales, de manera sucesiva para i=m-2 hasta i=1 las producciones en P(Xi) cuyos consecuentes se inician con algún Xj, conj>i,pueden transformarse, siguiendo el lema de ``Composición deproducciones'', en producciones equivalentes cuyos consecuentes seinician con símbolos terminales. Con todas estas transformaciones la gramática resultante G*=(V*,T,P*,S*) es, en efecto, equivalente a G y está en forma normal de Greibach. Ejemplo: Consideremos la gramática con símbolos variables y producciones la cual ya está en forma normal de Chomsky. Transformémosla de acuerdo con el procedimiento anterior. Observemos que las dos primeras producciones ya tienen el tipo de las buscadas en el paso 2. Del procedimiento anterior. La tercera tiene un consecuente que se inicia con un símbolo variable anterior al de su propio antecedente. Compongamos pues la producción 3. Con la 1. Obtenemos la cual también tiene un consecuente que se inicia con un símbolo variable anterior al de su propio antecedente. Compongamos pues la producción 4.con la 2. Obtenemos la cual es del tipo ``reflexivo''. Para transformarla, introduzcamos una nueva variable Y3. Obtenemos Con esto terminamos el paso 2. Del procedimiento anterior. El conjunto actual de producciones consta de las producciones 1., 2., 6. y 7.Pasemos pues al paso 3. Del procedimiento. Sustituyendo 6. En 2.obtenemos Sustituyendo 8. En 1. Obtenemos Sustituyendo 9. En 7. Obtenemos 10 nuevas producciones En resumen, la gramática equivalente, en forma normal de Greibach, tiene como conjunto de variables a y sus producciones son la 6., 8., 9. y 10.: