Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidades:
1.1 Alfabeto
Símbolos:
Es una entidad abstracta que no se puede definir, ya que se dejaría como una
axioma. Igual que se define un punto en la geometría. La cual normalmente los
símbolos son letras (a, b, c,…. z), dígitos (0,1,…9, caracteres (+, -, *, /,>,< …..). los
símbolos pueden estar formados por varias letras o caracteres.
Alfabeto:
1.2 Cadenas.
Longitud de cadena.
I abcb I = 4,
I a + 2*b I = 5
I 000111 I = 6
I if a > b then a = b; I = 9
Cadena Vacía.
Concatenación de cadenas.
La concatenación de dos cadenas u y v, escrita uv, es "pegar" las dos cadenas para
formar una nueva.
Ejemplo:
Sea u = ab
v = ca
w = bb. Entonces
uv = abca
uw = cabb
(uv) w = abcabb
u(vw) = abcabb
Es un conjunto de todas las cadenas donde podemos formar con símbolos del
alfabeto V le denominamos universo del discurso de V y la representamos de la
siguiente manera W (V). Es evidente que W(V) es un conjunto infinito y que la
cadena vacía pertenece a W(V).
Ejemplo:
Un afabeto con una sola letra V = { a }, podemos decir que el universo del discurso
es: W(V) = { λ, a, aa, aaa, aaaa,....} y asi contiene una cadenas infinitas.
1.1 Lenguajes.
La elección del término "lenguaje" puede parecer extraña. Sin embargo, los
lenguajes habituales pueden interpretarse como conjuntos de cadenas. Un ejemplo
seria el inglés, donde la colección de las palabras correctas inglesas es un conjunto
de cadenas del alfabeto que consta de todas las letras. Otro ejemplo es el lenguaje
C.
Lenguaje artificial.
Lenguaje regular.
Traductor.
Compilador.
Ensambladores.
Interpretes.
Conclusión
De esta manera se vio los conceptos teóricos de alfabeto, cadena, símbolo, longitud
de cadena, etc. Así como cada uno de sus temas y subtemas.
Unidad 2 - Expresiones Regulares.
L1 U L2={ x | x ∈ L1 ó x ∈ L2}
Concatenación: Consideremos dos lenguajes
definidos sobre el mismo alfabeto, L1 y L2. La
concatenación o producto de estos lenguajes es el
lenguaje L1 L2= { xy / x ∈ L1 y x ∈ L2} Las
palabras de este lenguaje estarán formadas al
concatenar cada una palabra del primero de los
lenguajes con otra del segundo.
La concatenación de lenguajes con el lenguaje vació
es ΦL = L Φ = Φ
Potencia de un lenguaje: Se define la potencia i-ésima de
un lenguaje a la operación de concatenarlo consigo
mismo i veces.
Li= LLL ....L
|------------|
i
Clausura positiva de un lenguaje: Se define la clausura
positiva de un lenguaje L:
∞
L + = U L i
i=1
Lenguaje obtenido uniendo el lenguaje con todas sus
potencias posibles excepto Lº. Si L no contiene la
palabra vacía, la clausura positiva tampoco
Cierre o Clausura de un lenguaje: Se define el cierre o
clausura de un lenguaje L como :
∞
L* = U Li
i=0
Lenguaje obtenido uniendo el lenguaje con todas sus
potencias posibles, incluso Lº. Todas las clausuras
contienen la palabra vacía.
Existen tres operaciones básicas que se pueden realizar
sobre las ER:
Selección de alternativas : Se indica con el
operador |(barra vertical). Si r y s son ER,
entonces r | s es una ER que define a cualquier
cadena que concuerde con una r o una s,
también se dice que r | s , es la unión de los
lenguajes de r y s y lo podemos definir: L( r | s )
= L( r ) U L( s ). Esta operación se puede
extender a más de dos ER.
Concatenación: Se indica con la yuxtaposición
de las ER. Si r y s son ER, entonces rs es una
ER que define a cualquier cadena que
concuerde con la concatenación de r y s , esta
operación la podemos definir: L(rs) =
L(r)L(s).Esta operación se puede extender a
más de dos ER.
Repetición o Cerradura: También se conoce con el
nombre de cerradura de Kleene. Se indica con el
operador *. Si r es una ER, entonces r* es una ER que
define a las cadenas de caracteres representadas por
la concatenación repetida de r en n veces, o sea que lo
podemos definir como: L(r*) = L(r)*o también lo
podemos definir como la unión infinita de conjuntos r :r*
n = r 0 r 1 r 2...r n.
2.3 Aplicaciones en problemas reales.
Una de las principales aplicaciones de los hermanos Deitel,
son las expresiones regulares que facilitan la
construcción de un compilador. A menudo se utiliza una
expresión regular larga y compleja para validar la
sintaxis de un programa. Si el código del programa no
concuerda con la expresión regular, el compilador sabe
que hay un error de sintaxis dentro del código.
Generalmente convierten la expresión regular a un
autómata finito no determinista y después construyen el
autómata finito determinista.
Otra aplicación del mismo libro es en los editores de texto.
También encontramos a las expresiones regulares en la
biología molecular. También hay esfuerzos importantes
para tratar de representar cadenas como generadas por
expresiones regulares o por lenguajes regulares.
Unidad 3: Autómatas Finitos.
Minimizar:
Los no finales son A, B, C Y D
Finales: E
Grupo Grupo
Grupo 1
1 1
A, B, C A, C A (representa A y C)
Grupo Grupo
Grupo 2
2 2
D B B
Grupo Grupo
Grupo 3
3 3
E D D
Grupo
Grupo 4
4
E E
a b
A B A
B B D
D B E
E B A
Autómatas Finitos
MT = ( E, A, B, e0, F, f)
donde: f: ( E - F ) x ( A È B ) Þ E x ( A È B) x (
I, O, D )
Entrada:
Cinta1: ...BBB...
Cinta2: ...BBB...
Salida:
Cinta1: ...0000...
Cinta2: ...λ$abba$aabbbbaa$...
Proceso:
Solución:
M=(Q,Σ,Γ,q_0,q_3,B,δ)
Definiciones.
Tokens:
Símbolos terminales de una gramática
o Identificadores, palabras reservadas,
operadores,...
o Varios signos pueden forman el mismo
token
Atributos:
Lexema:
Patrón:
Ejemplo:
Otras Funciones:
Manejo del fichero de entrada del programa
fuente: abrirlo, leer sus caracteres, cerrarlo y
gestionar posibles errores de lectura.
Eliminar comentarios, espacios en blanco,
tabuladores y saltos de línea (caracteres no
validos para formar un token).
Inclusión de ficheros: # include...
La expansión de macros y funciones in line: #
define...
Contabilizar el número de líneas y columnas para
emitir mensajes de error.
Reconocimiento y ejecución de las directivas de
compilación (por ejemplo, para depurar u
optimizar el código fuente).
Aspectos del Análisis Léxico.
operadores aritméticos
operadores
relacionales
operadores lógicos
operador de asignación
identificadores
constantes
cadenas
literales
signos de puntuación
librerías
Lexema:
Patrón:
Ejemplo:
A → BC o
A → a o
Tipos de Ambigüedad
Ambigüedad Inherente:
Las gramáticas que presentan este tipo de ambigüedad
no pueden utilizarse para lenguajes de programación,
ya que por más transformaciones que se realicen sobre
ellas, nunca se podrá eliminar completamente la
ambigüedad que presentan:
Analizador Descendente:
Analizador Ascendente:
Ejemplo:
ANTLR:
(ANother Tool for Language Recognition; en español
"otra herramienta para reconocimiento de lenguajes")
es una herramienta creada principalmente por Terence
Parr, que opera sobre lenguajes, proporcionando un
marco para construir reconocedores (parsers),
intérpretes, compiladores y traductores de lenguajes a
partir de las descripciones gramaticales de los mismos
(conteniendo acciones semánticas a realizarse en
varios lenguajes de programación).
GNU bison:
Es un programa generador de analizadores sintácticos
de propósito general perteneciente al proyecto GNU
disponible para prácticamente todos los sistemas
operativos, se usa normalmente acompañado de flex
aunque los analizadores léxicos se pueden también
obtener de otras formas.
Grammatica:
Es un generador de analizadores sintácticos de C# y
Java libre. Es similar a otras herramientas como Yacc o
ANTLR. Grammatica soporta el algoritmo LL(k) para
gramáticas con un número ilimitado de tokens de
anticipación. Está bastante bien probado, y ha sido auto
compilado desde la versión 0.1. La documentación
contiene una lista completa de características, así como
una comparación con otros generadores de
analizadores.
JavaCC:
(Java Compiler Compiler) es un generador de
analizadores sintácticos de código abierto para el
lenguaje de programación Java. JavaCC es similar a
Yacc en que genera un parser para una gramática
presentada en notación BNF, con la diferencia de que
la salida es en código Java. A diferencia de Yacc,
JavaCC genera analizadores descendentes (top-down),
lo que lo limita a la clase de gramáticas LL (K) (en
particular, la recursión desde izquierda no se puede
usar). El constructor de árboles que lo acompaña,
JJTree, construye árboles de abajo hacia arriba
(bottom-up).
Yacc:
Es un programa para generar analizadores sintácticos.
Las siglas del nombre significan Yet Another Compiler-
Compiler, es decir, "Otro generador de compiladores
más". Genera un analizador sintáctico (la parte de un
compilador que comprueba que la estructura del código
fuente se ajusta a la especificación sintáctica del
lenguaje) basado en una gramática analíticaescrita en
una notación similar a la BNF. Yacc genera el código
para el analizador sintáctico en el Lenguaje de
programación C.