unidad 3 analizador sintáctico. la funciÓn del analizador sintÁctico la principal tarea del...

51
Unidad 3 Analizador Sintáctico

Upload: victor-manuel-cuenca-acuna

Post on 03-Feb-2016

251 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Unidad 3 Analizador Sintáctico

Page 2: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO

• La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis del programa fuente sea correcta, sino construir una representación interna de ese programa y, en el caso en que sea un programa incorrecto, dar un mensaje de error.

• Para ello, el analizador sintáctico (A.S.) comprueba que el orden en que el A.L. le va entregando los tokens es válido. Si esto es así significará que la sucesión de símbolos que representan dichos tokens puede ser generada por la gramática correspondiente al lenguaje del código fuente.

• Se supone que el A.S. informará de cualquier error de sintaxis de manera inteligible.

• Y debería recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de su entrada.

Page 3: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Analizador Sintáctico

Analizador léxico

Analizador Sintáctico

Resto de etapas

Tabla de símbolos

Componente Léxico

Obtener siguiente

componente léxico

Árbol de

análisis sintáctico

Representación

intermedia

Programa

fuente

Posición del analizador sintáctico en el modelo del compilador

Page 4: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

IntroducciónEl análisis sintáctico (parser en lengua inglesa) toma los tokens que le envía el analizador léxico y comprueba si con ellos se puede formar alguna sentencia válida del lenguaje. Recuérdese que se entiende por sintaxis como el conjunto de reglas formales que especifican como se construyen las sentencias de un determinado lenguaje.

La sintaxis de los lenguajes de programación habitualmente se describe mediante gramáticas libres de contexto (o gramáticas tipo 2),

G = { S, VT, VNT, P } donde:

S: el axioma o símbolo inicialVT : conjunto de terminales, los componentes léxicos o tokensVNT : conjunto de no-terminalesP: conjunto de reglas de producción de la forma:VNT → X1, ... , Xn con Xi (VT VNT)*∈ ∪

utilizando para ello algún tipo de notación como por ejemplo, las notaciones BNF y EBNF. Esta especificación ofrece numerosas ventajas.

Page 5: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Una gramática da una especificación sintáctica precisa, y fácil de comprender, de un lenguaje de programación.

Para ciertas clases de gramáticas se puede construir automáticamente un analizador sintáctico, que determina si un programa está bien construido.

Como beneficio adicional, el proceso de construcción del analizador sintáctico puede revelar ambigüedades sintácticas y otras dificultades para la construcción del parser que de otra forma no serán detectadas en la fase de diseño inicial de un lenguaje y que podrían se arrastradas a su compilador.

Una gramática bien diseñada da una estructura al lenguaje de programación que se utiliza en la traducción del programa fuente en código objeto correcto y para la detección de errores. Existen herramientas que a partir de la descripción de la gramática se puede generar el código del analizador sintáctico.

Los lenguajes de programación después de un periodo de tiempo, adquieren nuevas construcciones y llevan a cabo tareas adicionales. Estas nuevas construcciones se pueden añadir más fácilmente al lenguaje cuando hay una implementación basada en una descripción gramatical del lenguaje.

Ventajas

Page 6: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Comprobar si la cadena de tokens proporcionada por el analizador léxico puede ser generada por la gramática que define el lenguaje fuente (gramática libre del contexto, GLC).

Construir el árbol de análisis sintáctico que define la estructura jerárquica de un programa y obtener la serie de derivaciones para generar la cadena de tokens. El árbol sintáctico se utilizará como representación intermedia en la generación de código.

Informar de los errores sintácticos de forma precisa y significativa. Deberá estar dotado de un mecanismo de recuperación de errores para continuar con el análisis.

Funciones del analizador sintáctico

Page 7: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Interfaces del analizador sintáctico

Tabla de símbolos

Analizador sintáctico

árbol

sintáctico

Analizador semántico

Representación

intermedia

Analizador léxico

Programa

fuente

token

pide siguiente

token

Gestor de errores

Gramática Libre de Contexto

Page 8: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

En resumen:

El análisis sintáctico se puede considerar como una función que toma como entrada la secuencia de componentes léxicos (tokens) producida por el análisis léxico y produce como salida el árbol sintáctico. En realidad, el análisis sintáctico hace una petición al análisis léxico del token siguiente en la entrada (los símbolos terminales) conforme lo va necesitando en el proceso de análisis.

Page 9: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Fundamentos de la

Teoría de Gramáticas Formales

Page 10: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto básico de Gramática. Ejemplos

Concepto de gramática formal

Tipos de Gramáticas. Jerarquía de Chomsky

Árboles de derivación

Ambigüedad

Recursividad

Factorización a izquierdas

Fundamentos de la Teoría de Gramáticas:

Page 11: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto básico de Gramática. Ejemplos

Concepto de gramática formal

Tipos de Gramáticas. Jerarquía de Chomsky

Árboles de derivación

Ambigüedad

Recursividad

Factorización a izquierdas

Fundamentos de la Teoría de Gramáticas:

Page 12: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto Básico de Gramática

Una gramática define la estructura de las frases y de las palabras de un lenguaje.

Las gramáticas son un método para la generaciónde palabras de un lenguaje a partir de un alfabeto.

–para generar estas palabras se utilizan las derivaciones.

–se denominan formales porque se centran en los estudios de los

lenguajes formales que son aquellos que están definidos a partir

de reglas preestablecidas. Para los lenguajes naturales existen

otro tipo de gramáticas.

Page 13: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto Básico de GramáticaLa gramática de la lengua castellana se expresa mediante reglas sencillas que definen las partes de la oración, y que permiten comprobar fácilmente si una frase determinada es o no correcta. Analizar la frase “La niña pedía comida a María en el parque”.

<oración> ::= <sujeto><predicado><sujeto> ::= <frase_nominal><frase_nominal> ::= <grupo_nominal><frase_nominal> ::= <grupo_nominal><calificativos><grupo_nominal> ::= <nombre><grupo_nominal> ::= <artículo><nombre><calificativo> ::= <conjunción><oración><calificativo> ::= <adjetivo><predicado> ::= <verbo><complementos><complementos> ::= <directo><indirecto><circunstancial><complementos> ::= <directo>< circunstancial><complementos> ::= <indirecto><circunstancial><complementos> ::= <circunstancial><circunstancial> ::= <circunstancial> ::= <circunstancial><circunstancial><directo> ::= <frase_nominal><indirecto> ::= “a”<frase_nominal><circunstancial> ::= <preposición><frase_nominal>

Page 14: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Obsérvese la existencia de recursividad en las reglas de producción. Algunas la introducen directamente, como en el caso

<circunstancial> ::=<circunstancial><circunstancial>,

mientras que en otras de forma indirecta

(<oración> <sujeto> <frase_nominal> <calificativo> <oración>). • Para completar las reglas sintácticas anteriores se necesita información morfológica sobre las palabras. Esta información también puede escribirse en forma de reglas de producción:

<nombre> ::= “niña”<nombre> ::= “María”<nombre> ::= “comida”<nombre> ::= “parque”<artículo> ::= “la”<verbo> ::= “pedía”<preposición> ::= “en”

Concepto Básico de Gramática

Page 15: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Teniendo en cuenta todas estas reglas, y aplicando el concepto de derivación, se puede obtener la frase considerada partiendo de una palabra de una sola letra <oración>: 

<oración>

→ <sujeto><predicado>

→ <frase_nominal><predicado>

→ <grupo_nominal><predicado>

→ <artículo><nombre><predicado>

→ la <nombre><predicado>

→ la niña <predicado>

→ la niña <verbo><complementos>

→ la niña pedía<complementos>

→ la niña pedía <directo><indirecto><circunstancial>

→ la niña pedía comida <indirecto><circunstancial>

Concepto Básico de Gramática

Page 16: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

→ la niña pedía comida a <frase_nominal><circunstancial>

→ la niña pedía comida a <grupo_nominal><circunstancial>

→ la niña pedía comida a <nombre><circusntancial>

→ la niña pedía comida a María <circunstancial>

→ la niña pedía comida a María <preposición><frase_nominal>

→ la niña pedía comida a María en <frase_nominal>

→ la niña pedía comida a María en <grupo_nominal>

→ la niña pedía comida a María en <articulo><nombre>

→ la niña pedía comida a María en el <nombre>

→ la niña pedía comida a María en el parque

 

Por tanto, al haber una derivación que produce dicha frase

partiendo de <oración>, se sigue que se trata de una frase

correcta que pertenece al lenguaje representado por la

gramática.

Concepto Básico de Gramática

Page 17: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Ejemplo: consideremos la instrucción de cualquier lenguaje x = y+2*zcon:

– Conjunto de producciones :

<instrucción> ::= <asignación><asignación> ::= <identificador>”=”<expresión><expresión> ::= <sumando><expresión> ::= <sumando>”+”<expresión><sumando> ::= <factor><sumando> ::= <factor> “*” <sumando><factor> ::= <identificador><factor> ::= <número>

– Reglas morfológicas :

<identificador> ::= “x”<identificador> ::= “y”<identificador> ::= “z”<número> ::= “2”

Concepto Básico de Gramática

Page 18: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Obtenemos la expresión x = y+2*z a partir de <instrucción> así: 

<instrucción>→ <asignación>→ <identificador> = <expresión>→ x = <expresión>→ x = <sumando> + <expresión>→ x = <factor> + <expresión>→ x = <identificador> + <expresión>→x = y+ <expresión>→x = y+ <sumando>→x = y+ <factor> * <sumando>→ x = y+ <número> * <sumando>→ x = y+2* <sumando>→ x = y+2* <factor>→ x = y+2* <identificador>→ x = y+2*z

Concepto Básico de Gramática

Page 19: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto básico de Gramática. Ejemplos

Concepto de gramática formal

Tipos de Gramáticas. Jerarquía de Chomsky

Árboles de derivación

Ambigüedad

Recursividad

Factorización a izquierdas

Fundamentos de la Teoría de Gramáticas:

Page 20: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

• Producción o regla (x::=y): es un par ordenado (x, y) con x, y ϵ ∑*, es decir, si se encuentra x como parte de cualquier palabra v se puede sustituir x por y en v, lo que permite transformar palabras en otras

• Derivación directa v → w: aplicación de una producción (x ::= y) a una palabra v para convertirla en otra w donde v=zxu y w=zyu (v, w, z, u ϵ ∑*)

– Se cumple que para cada producción x::=y existe una derivación directa (haciendo z=u=λ): x → y  • Derivación v → * w: aplicación de una secuencia de producciones a una palabra. • Longitud de la derivación: número de derivaciones que hay que aplicar para obtener la palabra.

Concepto de Gramática FormalDefiniciones

Page 21: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

• Derivación más a la izquierda: 

Se utiliza en cada derivación directa la producción aplicada a los símbolos

más a la izquierda de la palabra.

 • Derivación más a la derecha: 

Se utiliza en cada derivación directa la producción aplicada a los símbolos más a

la derecha de la palabra.

Concepto de Gramática Formal

Definiciones

Page 22: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Se denomina gramática formal a la cuádrupla 

G = (∑T, ∑N, S, P) 

– ∑T, alfabeto de símbolos terminales – ∑N, alfabeto de símbolos no terminales – S ϵ ∑N, es el axioma o símbolo inicial – P es un conjunto finito de reglas de producción de la forma

u ::= v, donde u ϵ ∑+ y v ϵ ∑*. Se verifica además que:

– ∑T ∩ ∑N = Φ

– el alfabeto es ∑ = ∑T U ∑N

Concepto de Gramática FormalDefiniciones

Page 23: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

• Ejemplo : consideremos la gramática

ST = {0, 1, 2}SN = {N, C}S = NP = { N::=NC, N::=C, C::=0, C::=1, C::=2}

• Es posible establecer una notación simplificada para las reglas deproducción. Si existen dos reglas de la forma

u::=v u::=w

se pueden representar de la forma:

u::=v | w Esta forma de representar las reglas de producción recibe el nombre de“forma normal de Backus” (o BNF)

Concepto de Gramática FormalForma normal de Backus

Page 24: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sea G = (∑T, ∑N, S, P). Una palabra x ϵ ∑* se denomina forma sentencial de

G si se verifica que

S →* x

– Considerando la gramática anterior, las siguientes son formas sentenciales : NCC, NC2, 120

S = N → NC → NCCS = N → NC → NCC → NC2S = N → NC → NCC → CCC → 1CC → 12C → 120  Si una forma sentencial x cumple que x ϵ ∑T* se dice que x

es una sentencia o instrucción de G. Es decir, las sentencias estarán compuestas únicamente por símbolos terminales.

– En el ejemplo anterior es sentencia: 120

Concepto de Gramática FormalForma normal de Backus

Page 25: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Lenguaje asociado a una gramática

• Sea una gramática G = (∑T, ∑N, S, P). Se llama lenguajeasociado a la G, o lenguaje generado por G, o lenguajedescrito por G, al conjunto :

L(G) = { x / S → * x and x ϵ ∑T * } Conjunto de todas las sentencias de la gramática

• Ya que la teoría de gramáticas formales (Chomsky), junto con la notación BNF, proporciona una forma de describir lenguajes, esta simbología se considera como un metalenguaje (lenguaje para describir lenguajes).

Concepto de Gramática Formal

Page 26: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Concepto básico de Gramática. Ejemplos

Concepto de gramática formal

Tipos de Gramáticas. Jerarquía de Chomsky

Árboles de derivación

Ambigüedad

Recursividad

Factorización a izquierdas

Fundamentos de la Teoría de Gramáticas:

Page 27: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Tipos de Gramáticas Jerarquía de Chomsky

Chomsky clasificó las gramáticas en cuatro grandes grupos :

G0, G1, G2 y G3. Cada uno de estos grupos incluye las

gramáticas del siguiente, de acuerdo con el siguiente

esquema:

G3 ⊂ G2 ⊂ G1 ⊂ G0

Page 28: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

• Las reglas de producción tienen la forma u ::= v

donde u ϵ ∑+, v ϵ ∑*, u = xAy con x ϵ ∑*, y ϵ ∑*, A ϵ ∑N sin otra restricción

– En las reglas de producción:

• La parte izquierda no puede ser la palabra vacía.

• En la parte izquierda (u) ha de aparecer algún símbolo no terminal.

• Los lenguajes representados por estas gramáticas reciben el nombre de

lenguajes sin restricciones. Puede demostrarse que todo lenguaje

representado por este tipo de gramáticas pueden ser descritos también

por un grupo de gramáticas un poco más restringido (llamado de

gramáticas de estructura de frases), cuyas producciones tienen la

forma xAy ::= xvy, donde x, y, v ϵ ∑*, siendo A un símbolo no

terminal.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 0

Page 29: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Ya que v puede ser la palabra vacía, se sigue que en estas reglas podemos encontrar situaciones en que la parte derecha sea más corta que la izquierda. Las reglas en que ocurre esto se denominan compresoras. Una gramática que contenga al menos una regla compresora se denomina gramática compresora.

En las gramáticas compresoras, las derivaciones pueden ser decrecientes, ya que la longitud de las palabras puede disminuir en cada uno de los pasos de derivación.

– Ejemplo: sea G = ({a, b}, {A, B, C}, A, P), donde P:A ::= aABC | abCCB ::= BCbB ::= bbbC ::= b

Tipos de Gramáticas Jerarquía de Chomsky

Page 30: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Esta gramática es de tipo 0, no es de estructura de frases por la reglaCB ::= BC

Formas de considerarla:• Considerando x = λ, A = C, y = B. Estaría formada la parte izquierda de la producción, pero la derecha será vB y sea cual sea v, no podrá ser BC.• Considerando x = C, A = B, y = λ. Así tendríamos formada la parte izquierda de la regla, pero en la derecha tendríamos Cv, y sea v lo que sea no podremos obtener CB.• Ya no es posible hacer ninguna otra descomposición, por lo que esta regla no pertenece al esquema de reglas visto para las gramáticas de estructura de frases. Para la producción : A ::= aABC:• A = A, x= λ, y = λ. Si hacemos v = aABC, la regla se ajusta al formato considerado.

Tipos de Gramáticas Jerarquía de Chomsky

Page 31: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sin embargo la regla CB ::= BC puede descomponerse en las cuatro reglas siguientes, que permiten obtener las mismas derivaciones con más pasos, pero ajustándose a las condiciones exigidas para que la gramática sea de estructura de frases.

CB ::= XBXB ::= XYXY ::= BYBY ::= BCLa gramática resultante, tendrá 3 reglas de producción más y dos símbolos adicionales (X, Y) en el alfabeto de símbolos no terminales.

Veamos la derivación de la sentencia aaabbb, mediante la gramática original :

A → a(A)BC → aa(A)BCBC → aaab(CB)CBC → aaa(bB)CCBC → aaab(bC)CBC → aaab(bC)BC → aaab(bB)C → aaabb(bC) → aaabbb

Se observa también que la gramática es compresora, debido a la presencia de

la regla bC ::= b.

Puede comprobarse que el lenguaje generado por esta gramática es{anbn|n=1,2,..}

Tipos de Gramáticas Jerarquía de Chomsky

Page 32: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

En resumen: Gramáticas de tipo 0

También llamadas gramáticas no restringidas o gramáticas con estructura de frase.

Las reglas de derivación son de la forma:

α→β

siendo α (∈ VN VT)∪ + β (∈ VN VT)* , es decir la única ∪restricción es que no puede haber reglas de la forma λ → β donde λ es la cadena vacía.

Page 33: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Ejemplo 1Sea la gramática definida por G1 = ({S}, {0,1}, S,P) donde P={(S → 000S111),(0S1→ 01)}. Determinar el lenguaje que genera.

Solución :La única forma de generar sentencias es aplicando cualquier nº de veces la primera producción y terminando con la aplicación de la segunda, así se obtiene el lenguaje:

S →000S111→000000S111111→ →0⋅ ⋅ ⋅ (3n − 1)0S11(3n − 1)→0(3n)1(3n)

Por consiguiente el lenguaje que genera esta gramática es el conjunto infinito de instrucciones que se indica a continuación :

L(G1) = {0(3n)1(3n)/n ≥ 1}

Ejemplo 2Si la 2ª producción de la gramática del ejemplo 1 fuese S →01 el lenguaje sería :

L(G2) = {0(3n + 1)1(3n + 1)/n ≥ 0}

Page 34: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sea la gramática G3 = ({S}, {a,b}, S, P) donde P={(S → aSb), (S → ab)}. Determinar el lenguaje que genera.

Solución : Aplicando la primera producción n-1 veces, seguida por la aplicación dela segunda producción, se tiene que :

S →aSb →aaSbb →a3Sb3→ →a⋅ ⋅ ⋅ (n − 1)Sb(n − 1)→anbn

El lenguaje generado :

L(G3)={an bn/n ≥ 1}

Ejemplo 3

Page 35: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Dada la gramática G4 = ({S,A}, {a,b}, S, P) donde P={(S → abAS), (abA → baab), (S → a), (A → b)}. Determinar el lenguaje que genera.Solución : Se generan sentencias del lenguaje aplicando las reglas hasta que se puedaver la forma general del lenguaje.

S →abAS →baabS →baabaS →aS →abAS →abbS →abbaS →abAS →abAabAS → →(abA)⋅ ⋅ ⋅ nS → (abb)naS →abAS →abAabAS → →(abA)⋅ ⋅ ⋅ nS → (baab)naS →abAS →abAabAS →abbbaabaS →abAS →abAabAS →baababbaS →abAS →abAabAS →abAabAabAS →baababbbaaba

L(G4) = {cadenas que contienen abb y baab intercambiándose y reproduciéndose cualquier número de veces, y terminando siempre con el símbolo a}

Se puede observar que la forma de expresar este lenguaje no es simple, y surge la necesidad de tener una herramienta que permita describir los lenguajes de otra forma.

Ejemplo 4

Page 36: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sea la gramática G5 = ({S,A,B}, {a,b}, S, P) donde las producciones P son :S →aB A →bAAS →bA B →bA →a B→bSA →aS B →aBB

Determinar el lenguaje que genera.

Solución : Se generan algunas instrucciones.

S →aB →abS →bA →baS →aB →abS →abbA →abbaS →bA →bbAA →bbaaS →aB →abS →abaB →ababS →ababaB →ababab

L(G5) = {cadenas que tienen igual nº de a que de b}

La demostración no es inmediata.Demostrar, ver (Hopcroft y Ullman (1979), pp. 81-82).

Ejemplo 5

Page 37: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sea la gramática G6 = (VN, VT, S, P) donde :VN = { <número> , <dígito> }VT = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }S = <número>Las reglas de producción P son :<número> ::= <dígito> <número><número> ::= <dígito><dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Determinar el lenguaje que genera.

Solución :Acontinuación se muestran algunas sentencias del lenguaje generado por esta gramática.

< número >→< dígito >< número >→ 7 < número >→ 72< número >→< dígito >→ 7< número >→< dígito >→ 0< número >→< dígito >< número >→< dígito >< dígito >< número >→ ⋅ ⋅→235⋅

L(G6) = {conjunto de los números naturales en base diez}.

Ejemplo 6

Page 38: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Sea la gramática G7 = ({A,S}, {a,b}, S, P) donde las reglas de producción son :S →aSS →aAA →bAA →bDeterminar el lenguaje que genera esta gramática.

Solución : Se muestran algunas sentencias del lenguaje generado por la gramática.

S →aS →aaA →aabS →aA →abS →aS →aaS →aaaS → →anS →a⋅ ⋅ ⋅ naA →an + 1bS →aA →abA →abbA →abbbA → →ab⋅ ⋅ ⋅ nA →abn + 1

El lenguaje generado se puede definir con la siguiente expresión regular

L(G7) = a a* b b*

Ejemplo 7

Page 39: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Las reglas de producción de esta gramática tienen la formaxAy ::= xvy

donde x, y ϵ ∑*, v ϵ ∑+ y A ha de ser un símbolo no terminal.(A puede transformarse en v sólo si aparece en el contexto definido por x e y)

• Ya que v no puede ser la palabra vacía, se deduce de aquí que este tipo de gramáticas no pueden tener reglas compresoras. Se admite una excepción en la regla S ::= λ (siendo S el axioma de la gramática). Como consecuencia se tiene que la palabra vacía pertenece al lenguaje generado por la gramática sólo si contiene esta regla.

• Los lenguajes generados por este tipo de gramáticas se denominan “dependientes del contexto”.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 1

Page 40: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Evidentemente todas las gramáticas de tipo 1 son también de tipo 0, y así, todos los lenguajes dependientes de contexto serán también lenguajes sin restricciones.

• Ejemplo1 :

G = ({S, B, C}, {a, b, b}, S,P), donde P es:

S ::= aSBc | aBCbB ::= bbbC ::= bcCB ::= BCcC ::= ccaB ::= ab

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 1

Page 41: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

La gramática G = ({S,A,B}, {a,b}, S, P) cuyas producciones P son:

S →aB A →bAAS →bA B →bA →a B→bSA →aS B →aBB

Ejemplo 3

La gramática G = (VN, VT, S, P) donde VN = { <número> , <dígito> }; VT = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 }; S = <número> y las reglas de producción P son:

<número> ::= <dígito> <número><número> ::= <dígito><dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Ejemplo 2

Page 42: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Ejemplo 4

La gramática G = ({a,b}, {A,S}, S, P) y sus producciones P son: S →aSS →aAA →bAA →b

Ejemplo 5

La gramática definida como G = ({S}, {a,b}, S, P) donde P son las siguientes

producciones : ?

S →aaaaSbbbbaSb →ab

La producción aSb →ab no es del tipo 1, pues se sustituye S por vacío en el contexto a...b.Sin embargo si esta producción fuera S →ab o aSb →abb, entonces sería de tipo1.

Page 43: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Ejemplo 6?

La gramática G = ({S,A}, {a,b}, S, P) con las producciones P siguientes :

S →abASabA →baabS →aA →b

No es del tipo 1, ya que la producción abA →baab no es sensible al contexto. Losería si fuese abA →abab.

Page 44: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Propiedades de las gramáticas de tipo 1

Propiedad de no decrecimiento

Las cadenas que se obtienen en cualquier derivación de una gramática de tipo 1 son de longitud no decreciente, es decir :

α→β | β |≥| α |⇒

y que se puede enunciar como la longitud de la parte derecha de la producción es mayor o igual a la de la parte izquierda.

La demostración es inmediata. Si se define una producción de un lenguaje tipo 1 como :

α A β → α γ β

siendo γ (∈ VN VT)∪ +, es decir γ nunca puede ser la cadena vacía, lo que implica que | γ |≥ 1 y como | A | como mínimo vale 1, queda demostrada la propiedad :

| α A β | ≤| α γ β |

Page 45: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Propiedad de sensibilidad al contexto

También se puede demostrar que si todas las reglas de una gramática cumplen la condición de no decrecimiento, se puede hallar una gramática equivalente con las producciones sensibles al contexto. Esta segunda propiedad combinada con la primera hace que se pueda intercambiar la característica de no decrecimientocon la definición.

Ejemplo 7Sea la gramática G = ({S,B,C}, {a,b,c}, S, P) donde P son las producciones :

S →aSBCS →aBCCB →BCbB →bbbC →bccC →ccaB →ab

La gramática anterior no es de tipo 1 según la definición dada, ya que la reglaCB → BC no respeta el contexto. Sin embargo puede apreciarse que todas las reglas de esta gramática son no decrecientes, por lo tanto es posible encontrar una gramática equivalente que genere el mismo lenguaje. Se puede sustituir la regla CB → BC por :

Page 46: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

CB → XBXB → XYXY → BYBY → BC

Puede observarse que ambas gramáticas son equivalentes y que generan el lenguaje :

L(G) = { an bn cn / n ≥ 1 }

Page 47: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Las reglas de estas gramáticas se ajustan al siguiente esquema:A ::= v

donde v ϵ ∑*, y A ϵ ∑N En concreto v puede ser λ.

Para toda gramática de tipo 2 existe una gramática equivalente desprovista de reglas de la forma A ::= λ, que generará el mismo lenguaje que la de partida, excepto la palabra vacía. Si se le añade a la segunda gramática la regla S ::= λ, las gramáticas generarán el mismo lenguaje.

Por lo tanto, se pueden definir las gramáticas de tipo 2 de una forma más restringida, en el que las reglas de producción tendrán la siguiente forma

A ::= v donde v ϵ ∑+, y A ϵ ∑N . Además podrán contener la reglaS ::= λ

Los lenguajes generados por este tipo de gramáticas se denominan independientes de contexto, ya que la conversión de A en v puede realizarse independientemente del contexto en que aparezca A.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 2

Page 48: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

La mayor parte de los lenguajes de programación de ordenadores pueden describirse mediante gramáticas de este tipo.

Ejemplo : sea la gramática G = ({a, b}, {S}, S, { S ::= aSb | ab}).Es una gramática de tipo 2. La derivación de la palabra aaabbb será:S → aSb → aaSbb → aaabbb

Puede verse que el lenguaje definido por esta gramática es {anbn | n=1, 2, ...}

Un mismo lenguaje puede generarse por muchas gramáticas diferentes. Sin embargo, una gramática determinada describe siempre un lenguaje único.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 2

Page 49: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

La gramática G = ({S,A,B}, {a,b}, S, P) cuyas producciones P se muestran a continuación es de tipo 2.

S →aB A →bAAS →bA B →bA →a B→bSA →aS B →aBB

Ejemplo 2

La gramática G = (VN, VT, S, P) donde VN = { <número> , <dígito> }; VT = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; S = <número> y las reglas de producción P que se muestran a continuación es de tipo 2.

<número> ::= <dígito> <número><número> ::= <dígito><dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Ejemplo 1

Page 50: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

Estas gramáticas se clasifican en los dos grupos siguientes:

• Gramáticas lineales por la izquierda, cuyas reglas de producción pueden tener una de las formas siguientes:

A ::= aA ::= VaS ::= λ donde a ϵ ∑T , A, V ϵ ∑N, y S es el axioma de la gramática.

• Gramáticas lineales por la derecha, cuyas reglas de producción tendrán la forma:A ::= aA ::= aV S ::= λdonde a ϵ ∑T , A, V ϵ ∑N, y S es el axioma de la gramática.

• Los lenguajes representados por este tipo de gramáticas se denominan lenguajesregulares.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 3

Page 51: Unidad 3 Analizador Sintáctico. LA FUNCIÓN DEL ANALIZADOR SINTÁCTICO La principal tarea del analizador sintáctico (o parser) no es comprobar que la sintaxis

G1 = ({ 0, 1}, {A, B}, A, { A ::= B1 | 1, B ::= A0})Gramática lineal por la izquierda que describe el lenguaje:

L1 = { 1, 101, 10101, ... } = {1(01)n | n = 0, 1, 2, ...}

G2 = ({ 0, 1}, {A, B}, A, { A ::= 1B | 1, B ::= 0A})Gramática lineal por la derecha que genera el mismo lenguaje que la gramática anterior.

Tipos de Gramáticas Jerarquía de Chomsky

Gramáticas tipo 3