Este documento discute la ambigüedad en las gramáticas formales y cómo tratarla. Explica que una gramática es ambigua si una cadena puede derivarse de más de una manera, y que la ambigüedad es mala porque deja el significado de algunos programas indefinido. Luego, describe algunas formas de tratar la ambigüedad, como reescribir la gramática para que no sea ambigua, usar declaraciones de precedencia y asociatividad, o eliminar recursión por la izquierda.
Este documento presenta un curso sobre MySQL para principiantes. Explica conceptos básicos como crear bases de datos y tablas, insertar y consultar datos. El objetivo es que cualquier persona, incluso sin experiencia previa en programación, pueda aprender MySQL de forma sencilla a través de conceptos teóricos, ejemplos resueltos y ejercicios prácticos.
Este documento presenta dos aplicaciones de los árboles: 1) los árboles binarios de búsqueda, que permiten almacenar y buscar elementos de una lista de manera eficiente, y 2) los códigos instantáneos, que permiten codificar caracteres usando cadenas de bits de longitud variable para comprimir datos. También describe el algoritmo de Huffman, el cual genera códigos instantáneos óptimos que minimizan la longitud total de bits requerida.
Este documento describe la arquitectura de buses en una computadora. Explica que los buses conectan los componentes de una computadora como la CPU, memoria y dispositivos de entrada/salida a través de líneas que transmiten señales de direcciones, datos y control. También describe la estructura, tipos y jerarquía típica de buses, con buses más rápidos cerca de la CPU y buses más lentos para dispositivos periféricos.
Este documento describe los algoritmos de Kruskal y Prim para encontrar el árbol de expansión mínima en un grafo. El algoritmo de Kruskal ordena las aristas de menor a mayor peso y las va agregando siempre que no formen ciclos. El algoritmo de Prim comienza con un vértice y va agregando aristas de peso mínimo que conecten vértices dentro y fuera del árbol en construcción.
Este documento describe varios protocolos de comunicación comúnmente utilizados, incluyendo TCP/IP, el protocolo básico para la transmisión de información entre redes; TCP, que proporciona una transmisión de datos confiable; HTTP, que permite la recuperación y búsqueda de información en la web; y FTP, que se utiliza para transferir archivos de forma remota. También describe protocolos como SSH para mejorar la seguridad, UDP para comunicaciones sin conexión, y SNMP para la gestión de redes.
Las cuentas de grupo son colecciones de cuentas de usuario que facilitan la administración de la red asignando permisos y privilegios a múltiples usuarios de forma simultánea. Los grupos pueden ser locales, globales o universales dependiendo de su alcance y los recursos a los que otorgan acceso. Los grupos simplifican la administración de recursos como directorios, archivos e impresoras al permitir conceder permisos a varios usuarios a la vez.
Este documento explica cómo crear y usar arreglos en PSeInt. Los arreglos permiten almacenar múltiples datos del mismo tipo usando un identificador y subíndices. Para crear un arreglo en PSeInt se usa la palabra clave "Dimension" seguida del nombre e identificador entre corchetes. El documento provee ejemplos como crear arreglos con números ingresados manualmente o por el usuario, sumar elementos de arreglos, y llenar arreglos con números aleatorios.
El documento describe los árboles binarios y sus diferentes tipos de recorridos (preorden, inorden y postorden). Un árbol binario es una estructura de datos donde cada nodo puede tener hasta dos hijos. Los recorridos visitan los nodos de diferente manera - preorden visita la raíz primero, inorden visita el subárbol izquierdo, luego la raíz y luego el derecho, y postorden visita los subárboles primero y luego la raíz.
Este documento presenta un curso sobre MySQL para principiantes. Explica conceptos básicos como crear bases de datos y tablas, insertar y consultar datos. El objetivo es que cualquier persona, incluso sin experiencia previa en programación, pueda aprender MySQL de forma sencilla a través de conceptos teóricos, ejemplos resueltos y ejercicios prácticos.
Este documento presenta dos aplicaciones de los árboles: 1) los árboles binarios de búsqueda, que permiten almacenar y buscar elementos de una lista de manera eficiente, y 2) los códigos instantáneos, que permiten codificar caracteres usando cadenas de bits de longitud variable para comprimir datos. También describe el algoritmo de Huffman, el cual genera códigos instantáneos óptimos que minimizan la longitud total de bits requerida.
Este documento describe la arquitectura de buses en una computadora. Explica que los buses conectan los componentes de una computadora como la CPU, memoria y dispositivos de entrada/salida a través de líneas que transmiten señales de direcciones, datos y control. También describe la estructura, tipos y jerarquía típica de buses, con buses más rápidos cerca de la CPU y buses más lentos para dispositivos periféricos.
Este documento describe los algoritmos de Kruskal y Prim para encontrar el árbol de expansión mínima en un grafo. El algoritmo de Kruskal ordena las aristas de menor a mayor peso y las va agregando siempre que no formen ciclos. El algoritmo de Prim comienza con un vértice y va agregando aristas de peso mínimo que conecten vértices dentro y fuera del árbol en construcción.
Este documento describe varios protocolos de comunicación comúnmente utilizados, incluyendo TCP/IP, el protocolo básico para la transmisión de información entre redes; TCP, que proporciona una transmisión de datos confiable; HTTP, que permite la recuperación y búsqueda de información en la web; y FTP, que se utiliza para transferir archivos de forma remota. También describe protocolos como SSH para mejorar la seguridad, UDP para comunicaciones sin conexión, y SNMP para la gestión de redes.
Las cuentas de grupo son colecciones de cuentas de usuario que facilitan la administración de la red asignando permisos y privilegios a múltiples usuarios de forma simultánea. Los grupos pueden ser locales, globales o universales dependiendo de su alcance y los recursos a los que otorgan acceso. Los grupos simplifican la administración de recursos como directorios, archivos e impresoras al permitir conceder permisos a varios usuarios a la vez.
Este documento explica cómo crear y usar arreglos en PSeInt. Los arreglos permiten almacenar múltiples datos del mismo tipo usando un identificador y subíndices. Para crear un arreglo en PSeInt se usa la palabra clave "Dimension" seguida del nombre e identificador entre corchetes. El documento provee ejemplos como crear arreglos con números ingresados manualmente o por el usuario, sumar elementos de arreglos, y llenar arreglos con números aleatorios.
El documento describe los árboles binarios y sus diferentes tipos de recorridos (preorden, inorden y postorden). Un árbol binario es una estructura de datos donde cada nodo puede tener hasta dos hijos. Los recorridos visitan los nodos de diferente manera - preorden visita la raíz primero, inorden visita el subárbol izquierdo, luego la raíz y luego el derecho, y postorden visita los subárboles primero y luego la raíz.
La máquina de Turing es una abstracción matemática que puede aceptar diferentes lenguajes formales. Un lenguaje aceptado por una máquina de Turing se define por la 7-tupla que describe la máquina y se conoce como un lenguaje recursivamente enumerable. Los lenguajes recursivamente enumerables incluyen lenguajes regulares, independientes de contexto y dependientes de contexto, y son cerrados bajo ciertas operaciones. Las máquinas de Turing pueden reconocer una variedad de lenguajes formales definidos por gramáticas u otros mecan
El documento describe los árboles como una estructura de datos, incluyendo definiciones de árboles binarios, recorridos en árboles binarios, árboles de búsqueda como árboles lexicográficos y árboles hilvanados, e implementaciones en lenguajes de programación. También cubre objetivos, introducción a árboles, y características y tipos de árboles.
Este documento resume los diferentes tipos de operadores en C++, incluyendo operadores aritméticos, relacionales, lógicos, de dirección, de bits y de asignación. Explica qué es cada operador y cómo funciona, además de cubrir conceptos como precedencia y asociatividad de operadores.
Este documento presenta una introducción al análisis y diseño orientado a objetos. Explica brevemente los modelos de ciclo de vida, con énfasis en los ciclos iterativos e incrementales. Luego, describe las diferencias entre el análisis, que se centra en identificar los requisitos del problema, y el diseño, que se enfoca en cómo resolverlo. Finalmente, resume algunas técnicas clave de análisis orientado a objetos como casos de uso, diagramas de clases y secuencias.
El álgebra relacional proporciona un conjunto de operaciones para manipular relaciones, las cuales se pueden clasificar en: a) operaciones conjuntistas como unión, intersección, diferencia y producto cartesiano, y b) operaciones específicamente relacionales como selección, proyección y combinación. Las operaciones del álgebra relacional pueden formar secuencias para resolver consultas complejas.
1) Las expresiones regulares permiten describir lenguajes regulares de forma concisa mediante un conjunto limitado de operadores. 2) Se presentan conceptos básicos como símbolos, cadenas, alfabetos y lenguajes. 3) Se definen las reglas para construir expresiones regulares a partir de símbolos individuales y las operaciones de unión, concatenación y clausura.
Este documento presenta información sobre programación concurrente utilizando hilos. Explica conceptos como hilos, clases Thread y Monitor, y métodos para la sincronización de hilos como lock, wait y pulse. También presenta ejemplos de código para crear y manejar hilos, y describe problemas como el problema de los filósofos comensales que requieren sincronización de hilos.
El documento describe la historia y características del lenguaje de programación C++. C++ fue creado en 1950 y se basa en la programación orientada a objetos, extendiendo el lenguaje C. Permite agrupar datos con funciones para manipularlos y reutilizar funciones en diferentes situaciones. C++ incluye características como encapsulación, herencia y polimorfismo.
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
El documento describe los diferentes métodos para manejar la entrada y salida de datos en un sistema computacional. Estos incluyen módulos de entrada/salida que controlan los dispositivos externos, entrada/salida programada donde la CPU controla las transferencias de datos, y entrada/salida mediante interrupciones donde los dispositivos notifican a la CPU cuando están listos para transferir datos. También se mencionan el acceso directo a memoria usando canales DMA para transferencias eficientes sin involucrar a la CPU.
Este documento presenta una introducción a la teoría de grafos. Explica que los grafos se utilizan para modelar situaciones mediante una representación simplificada que considera solo las características relevantes. Define formal e informalmente los conceptos de vértices, aristas y grafos. Luego introduce otras definiciones como vértices adyacentes, grado de un vértice y representaciones matriciales de grafos. Finalmente, aborda conceptos como caminos, ciclos, grafos regulares e isomorfismos.
Este documento explica las gramáticas ambiguas y las gramáticas libres de contexto. Define la ambigüedad como cuando algo tiene más de una interpretación. Las gramáticas ambiguas generan lenguajes donde una cadena puede tener más de un árbol sintáctico. Las gramáticas libres de contexto definen reglas formales para lenguajes de programación y usan derivaciones para evaluar cadenas. Las derivaciones pueden ser ambiguas dependiendo de si se hacen hacia la izquierda o derecha.
Material suministrado por el profesor Andrés Rodríguez para el curso Introducción a la lógica de la Universidad Estatal a Distancia. San José, Costa Rica. Mayo 2012
Este documento describe diferentes tipos de árboles como estructuras de datos no lineales, incluyendo árboles m-way, 2-3 y 2-3-4. Explica sus características, ventajas y desventajas, y cómo funcionan para almacenar y recuperar datos de manera ordenada y eficiente. También discute ejemplos y aplicaciones comunes como tablas de símbolos en compiladores y diccionarios. Concluye que estos árboles son útiles cuando se necesita acceder a datos de forma eficiente y eficaz sin
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
Se presentan los algoritmos de unificación y resolución en lógica de primer orden.
Este es el tema 11 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/tema
Base de datos orientada a objetos vs base obje to relacionAlfonso Triana
El documento compara las bases de datos orientadas a objetos y las bases de datos objeto relacionales. Las bases de datos orientadas a objetos almacenan datos y métodos, permitiendo objetos complejos y encapsulamiento, mientras que las bases de datos objeto relacionales son híbridas y permiten que los datos se almacenen como objetos dentro de una estructura relacional.
Este documento introduce conceptos clave de ecuaciones diferenciales de primer orden, incluyendo definiciones de variable independiente, variable dependiente, solución de una ecuación diferencial, y orden de una ecuación diferencial. También proporciona ejemplos para ilustrar estos conceptos.
Las redes de Petri son una representación matemática de sistemas discretos que constan de lugares, transiciones y marcas. Permiten modelar el comportamiento dinámico de sistemas mediante la evolución de las marcas en los lugares. Se utilizan para modelar procesos concurrentes y analizar propiedades como sincronización, condiciones de carrera y deadlock.
Una clase abstracta define comportamiento común para sus subclases pero no puede crear instancias, mientras que una interfaz define un contrato de métodos abstractos que clases concretas deben implementar. Ambos permiten modelar jerarquías de clases con comportamiento polimórfico.
Este documento define conceptos básicos de lenguajes formales y autómatas como símbolos, palabras, longitud de palabras, palabra vacía, operaciones como concatenación, potencia y reflexión. Explica que los autómatas y lenguajes formales permiten realizar estas operaciones y están constituidos por un alfabeto finito de símbolos, el universo de palabras que se pueden formar con dichos símbolos, y dan ejemplos de estos conceptos.
La máquina de Turing es una abstracción matemática que puede aceptar diferentes lenguajes formales. Un lenguaje aceptado por una máquina de Turing se define por la 7-tupla que describe la máquina y se conoce como un lenguaje recursivamente enumerable. Los lenguajes recursivamente enumerables incluyen lenguajes regulares, independientes de contexto y dependientes de contexto, y son cerrados bajo ciertas operaciones. Las máquinas de Turing pueden reconocer una variedad de lenguajes formales definidos por gramáticas u otros mecan
El documento describe los árboles como una estructura de datos, incluyendo definiciones de árboles binarios, recorridos en árboles binarios, árboles de búsqueda como árboles lexicográficos y árboles hilvanados, e implementaciones en lenguajes de programación. También cubre objetivos, introducción a árboles, y características y tipos de árboles.
Este documento resume los diferentes tipos de operadores en C++, incluyendo operadores aritméticos, relacionales, lógicos, de dirección, de bits y de asignación. Explica qué es cada operador y cómo funciona, además de cubrir conceptos como precedencia y asociatividad de operadores.
Este documento presenta una introducción al análisis y diseño orientado a objetos. Explica brevemente los modelos de ciclo de vida, con énfasis en los ciclos iterativos e incrementales. Luego, describe las diferencias entre el análisis, que se centra en identificar los requisitos del problema, y el diseño, que se enfoca en cómo resolverlo. Finalmente, resume algunas técnicas clave de análisis orientado a objetos como casos de uso, diagramas de clases y secuencias.
El álgebra relacional proporciona un conjunto de operaciones para manipular relaciones, las cuales se pueden clasificar en: a) operaciones conjuntistas como unión, intersección, diferencia y producto cartesiano, y b) operaciones específicamente relacionales como selección, proyección y combinación. Las operaciones del álgebra relacional pueden formar secuencias para resolver consultas complejas.
1) Las expresiones regulares permiten describir lenguajes regulares de forma concisa mediante un conjunto limitado de operadores. 2) Se presentan conceptos básicos como símbolos, cadenas, alfabetos y lenguajes. 3) Se definen las reglas para construir expresiones regulares a partir de símbolos individuales y las operaciones de unión, concatenación y clausura.
Este documento presenta información sobre programación concurrente utilizando hilos. Explica conceptos como hilos, clases Thread y Monitor, y métodos para la sincronización de hilos como lock, wait y pulse. También presenta ejemplos de código para crear y manejar hilos, y describe problemas como el problema de los filósofos comensales que requieren sincronización de hilos.
El documento describe la historia y características del lenguaje de programación C++. C++ fue creado en 1950 y se basa en la programación orientada a objetos, extendiendo el lenguaje C. Permite agrupar datos con funciones para manipularlos y reutilizar funciones en diferentes situaciones. C++ incluye características como encapsulación, herencia y polimorfismo.
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
El documento describe los diferentes métodos para manejar la entrada y salida de datos en un sistema computacional. Estos incluyen módulos de entrada/salida que controlan los dispositivos externos, entrada/salida programada donde la CPU controla las transferencias de datos, y entrada/salida mediante interrupciones donde los dispositivos notifican a la CPU cuando están listos para transferir datos. También se mencionan el acceso directo a memoria usando canales DMA para transferencias eficientes sin involucrar a la CPU.
Este documento presenta una introducción a la teoría de grafos. Explica que los grafos se utilizan para modelar situaciones mediante una representación simplificada que considera solo las características relevantes. Define formal e informalmente los conceptos de vértices, aristas y grafos. Luego introduce otras definiciones como vértices adyacentes, grado de un vértice y representaciones matriciales de grafos. Finalmente, aborda conceptos como caminos, ciclos, grafos regulares e isomorfismos.
Este documento explica las gramáticas ambiguas y las gramáticas libres de contexto. Define la ambigüedad como cuando algo tiene más de una interpretación. Las gramáticas ambiguas generan lenguajes donde una cadena puede tener más de un árbol sintáctico. Las gramáticas libres de contexto definen reglas formales para lenguajes de programación y usan derivaciones para evaluar cadenas. Las derivaciones pueden ser ambiguas dependiendo de si se hacen hacia la izquierda o derecha.
Material suministrado por el profesor Andrés Rodríguez para el curso Introducción a la lógica de la Universidad Estatal a Distancia. San José, Costa Rica. Mayo 2012
Este documento describe diferentes tipos de árboles como estructuras de datos no lineales, incluyendo árboles m-way, 2-3 y 2-3-4. Explica sus características, ventajas y desventajas, y cómo funcionan para almacenar y recuperar datos de manera ordenada y eficiente. También discute ejemplos y aplicaciones comunes como tablas de símbolos en compiladores y diccionarios. Concluye que estos árboles son útiles cuando se necesita acceder a datos de forma eficiente y eficaz sin
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
Se presentan los algoritmos de unificación y resolución en lógica de primer orden.
Este es el tema 11 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/tema
Base de datos orientada a objetos vs base obje to relacionAlfonso Triana
El documento compara las bases de datos orientadas a objetos y las bases de datos objeto relacionales. Las bases de datos orientadas a objetos almacenan datos y métodos, permitiendo objetos complejos y encapsulamiento, mientras que las bases de datos objeto relacionales son híbridas y permiten que los datos se almacenen como objetos dentro de una estructura relacional.
Este documento introduce conceptos clave de ecuaciones diferenciales de primer orden, incluyendo definiciones de variable independiente, variable dependiente, solución de una ecuación diferencial, y orden de una ecuación diferencial. También proporciona ejemplos para ilustrar estos conceptos.
Las redes de Petri son una representación matemática de sistemas discretos que constan de lugares, transiciones y marcas. Permiten modelar el comportamiento dinámico de sistemas mediante la evolución de las marcas en los lugares. Se utilizan para modelar procesos concurrentes y analizar propiedades como sincronización, condiciones de carrera y deadlock.
Una clase abstracta define comportamiento común para sus subclases pero no puede crear instancias, mientras que una interfaz define un contrato de métodos abstractos que clases concretas deben implementar. Ambos permiten modelar jerarquías de clases con comportamiento polimórfico.
Este documento define conceptos básicos de lenguajes formales y autómatas como símbolos, palabras, longitud de palabras, palabra vacía, operaciones como concatenación, potencia y reflexión. Explica que los autómatas y lenguajes formales permiten realizar estas operaciones y están constituidos por un alfabeto finito de símbolos, el universo de palabras que se pueden formar con dichos símbolos, y dan ejemplos de estos conceptos.
2. Repaso
• Un analizador sintáctico consume una
secuencia de tokens s y produce un árbol
sintáctico.
Puntos importantes:
– ¿Cómo reconocemos que s ∈ L(G)?
– Un árbol sintáctico de s describe cómo s ∈ L(G).
– Ambigüedad: más de un árbol sintáctico para la
misma cadena s
– Error: no existe árbol sintáctico para la cadena s.
– ¿Cómo construimos el árbol sintáctico?
4. Ejemplo de Ambiguedad
• La cadena int + int + int tiene dos
árboles sintácticos
E E
E + E E + E
E + E int int E + E
+ es asociativa
int int a la izquierda int int
5. Ambigüedad. Ejemplo
• La cadena int * int + int tiene dos
árboles de derivación
E E
E + E E * E
E * E int int E + E
Tiene mayor
precedencia que
int int + int int
6. Ambigüedad (Cont.)
• Una gramática es ambigua si tiene más de
un árbol sintáctico para alguna cadena.
– Equivalente, existe más de una derivación por la
derecha o por la izquierda de alguna cadena
• La ambigüedad es mala
– Deja el significado de algunos programas
indefinidos.
• La ambigüedad es común en lenguajes de
programación
– Expresiones Aritméticas
– IF-THEN-ELSE
7. Como tratar la ambigüedad
• Hay diferentes maneras de tratar con la
ambigüedad
• El método más directo es reescribir la
gramática de forma no ambigua.
E → E+TT
T → T * intint(E)
• Imponer precedencia de * sobre +
• Imponer asociatividad a la izquierda de + y *
8. Ambigüedad. Ejemplo
La cadena int * int + int tiene dos árboles de derivación
E E
E + E E * E
E * E int int E + E
int int int int
9. Ambigüedad: El Else
ambiguo
• Considere la gramática
E → if E then E
if E then E else E
OTHER
• Esta gramática es ambigua.
10. El Else ambiguo: Ejemplo
• La expresión:
If E1 then E2 then E3 else E4
Tiene dos árboles sintácticos Típicamente
if if queremos la
segunda forma
E1 if
E1 if E4
E2 E3 E4
E2 E3
11. El Else ambiguo: una forma
de repararlo
• else combina el then más cercano que no
haya sido combinado
• Podemos describirlo en la gramática
– (distinguiendo entre then combinados y no
combinados)
E → MIF /* todos los then combinados */
UIF /* algún then no combinado */
MIF → if E then MIF else MIF
OTHER
UIF → if E then E
If E then MIF else UIF
Describen el mismo conjunto de cadenas
12. El Else ambiguo: Ejemplo
Corregido
La expresión if E1 then E2 then E3 else E4
if if
E1 if
E1 if E4
E2 E3 E4
E2 E3
No válido por que la expresión Un árbol sintáctico
then no es MIF Válido (para un UIF)
13. Ambigüedad
• No existe regla general para tratar la
ambigüedad.
• Imposible convertir de manera automática
una gramática ambigua en una no ambigua.
• Si se emplea con cuidado, la ambigüedad
puede simplificar la gramática.
– Algunas veces permite definiciones más naturales
– Necesitamos mecanismos para quitar la
ambigüedad,
14. Precedencia y Asociatividad
• En vez de reescribir la gramática
– Usar la gramática más natural (ambigua)
– Junto con declaraciones no ambiguas
• La mayoría de las herramientas permite
precedencia y asociatividad en las
declaraciones de gramáticas
• Ejemplos . . .
15. Declaraciones asociativas
• Considere la gramática E →E+Eint
• Ambigüedad: dos árboles de int+int+int
E
E
E + E E + E
E + E int int E + E
Declaración de
asociatividad a la
int int izquierda %left + int int
16. Declaración de Precedencia
• Considere la gramática
E →E+EE*E int
• La cadena int+int*int
E
E
E * E E + E
E + E int int E * E
Declaración de
int int Precedencia: %left + int int
% left *
17. Resumen
• Podemos especificar la sintaxis de un
lenguaje empleando una GLC
• Un parser responderá si s ∈ L(G)
– Y construirá un árbol sintáctico
– Y lo pasará al resto de la fase de compilado.
• Siguiente clase:
– ¿Cómo respondemos sí s ∈ L(G) y construimos
un árbol sintáctico?
18. Eliminación de recursión
por la izquierda inmediata
• Considere la gramática recursiva por la
izquierda
S →Sαβ
• S genera todas las cadenas comenzando con
β seguido de un número de α´s
• Podemos reescribirla empleando recursión
por la derecha.
– S → βS´
– S´ →αS´ε
19. Eliminación de recursión
por la izquierda inmediata.
Ejemplo
• Considere la gramática
– S → 1 S0 (β=1 y α=0)
Podemos reescribir como:
S → 1S´
S´ →0S´ε
20. Eliminación de recursión
por la izquierda inmediata
• En general
– S →Sα1…Sαnβ1…βm
• Todas las cadenas derivadas a partir de S
comienzan con uno de los β1…βm y continúan
con varias instancias de α1…αn
• Reescribir como
– S →β1S´…βmS´
– S´ →α1S´…αnS´ε
21. Forma general de recursión
izquierda inmediata
• La gramática
– S → Aαδ
– A→ Sβ
También es recursiva por la izquierda por que
S →+ Sβα
• Esta recursión por la izquierda también se puede
eliminar
22. Eliminación de recursión
por la izquierda general
• Algoritmo
– Entrada: Una gramática G sin ciclos
(derivaciones de la forma A ⇒+ A) o
producciones epsilon (producciones de la
forma A →ε)
– Salida: Una gramática equivalente sin
recursión por la izquierda
23. Eliminación de recursión
por la izquierda general
Acomoda los no terminales en algún orden A1,A2,…,
An
Para (cada i desde 1 a n) {
para (cada j de 1 a i-1) {
reemplazar cada producción de la forma Ai→Ajγ
por las producciones Ai→δ1γ|δ2γ|… | δkγ
donde Aj→δ1|δ2|… | δk son las Aj
producciones
}
eliminar la recursión por la izquierda inmediata de
la gramática
}