SlideShare una empresa de Scribd logo
1 de 37
Descargar para leer sin conexión
Tema 12: Analizadores sintácticos funcionales
Informática (2014–15)
José A. Alonso Jiménez
Grupo de Lógica Computacional
Departamento de Ciencias de la Computación e I.A.
Universidad de Sevilla
IM Tema 12: Analizadores sintácticos funcionales
Tema 12: Analizadores sintácticos funcionales
1. Analizadores sintácticos
2. El tipo de los analizadores sintácticos
3. Analizadores sintácticos básicos
4. Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Elección de analizadores sintácticos
5. Primitivas derivadas
6. Tratamiento de los espacios
7. Analizador de expresiones aritméticas
2 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizadores sintácticos
Analizadores sintácticos
Un analizador sintáctico es un programa que analiza textos para
determinar su estructura sintáctica.
Ejemplo de análisis sintáctico aritmético: La estructura sintáctica
de la cadena "2*3+4" es el árbol
+
*
2 3
4
El análisis sintáctico forma parte del preprocesamiento en la
mayoría de las aplicaciones reales.
3 / 37
IM Tema 12: Analizadores sintácticos funcionales
El tipo de los analizadores sintácticos
Opciones para el tipo de los analizadores sintácticos
Opción inicial:
type Analizador = String -> Tree
Con la parte no analizada:
type Analizador = String -> (Tree,String)
Con todos los análisis:
type Analizador = String -> [(Tree,String)]
Con estructuras arbitrarias:
type Analizador a = String -> [(a,String)]
Simplificación: analizadores que fallan o sólo dan un análisis.
4 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizadores sintácticos básicos
Analizadores sintácticos básicos: resultado
(analiza a cs) analiza la cadena cs mediante el analizador a.
Por ejemplo,
analiza :: Analizador a -> String -> [(a,String)]
analiza a cs = a cs
El analizador resultado v siempre tiene éxito, devuelve v y no
consume nada. Por ejemplo,
ghci> analiza (resultado 1) "abc"
[(1,"abc")]
resultado :: a -> Analizador a
resultado v = xs -> [(v,xs)]
5 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizadores sintácticos básicos
Analizadores sintácticos básicos: fallo
El analizador fallo siempre falla. Por ejemplo,
ghci> analiza fallo "abc"
[]
fallo :: Analizador a
fallo = xs -> []
6 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizadores sintácticos básicos
Analizadores sintácticos básicos: elemento
El analizador elemento falla si la cadena es vacía y consume el
primer elemento en caso contrario. Por ejemplo,
ghci> analiza elemento ""
[]
ghci> analiza elemento "abc"
[('a',"bc")]
elemento :: Analizador Char
elemento = xs -> case xs of
[] -> []
(x:xs) -> [(x , xs)]
7 / 37
IM Tema 12: Analizadores sintácticos funcionales
Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Tema 12: Analizadores sintácticos funcionales
1. Analizadores sintácticos
2. El tipo de los analizadores sintácticos
3. Analizadores sintácticos básicos
4. Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Elección de analizadores sintácticos
5. Primitivas derivadas
6. Tratamiento de los espacios
8 / 37
IM Tema 12: Analizadores sintácticos funcionales
Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Secuenciación de analizadores sintácticos
((p >*> f) e) falla si el análisis de e por p falla, en caso
contrario, se obtiene un valor (v) y una salida (s), se aplica la
función f al valor v obteniéndose un nuevo analizador con el que
se analiza la salida s.
infixr 5 >*>
(>*>) :: Analizador a -> (a -> Analizador b) ->
Analizador b
p >*> f = ent -> case analiza p ent of
[] -> []
[(v,sal)] -> analiza (f v) sal
9 / 37
IM Tema 12: Analizadores sintácticos funcionales
Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Secuenciación de analizadores sintácticos
primeroTercero es un analizador que devuelve los caracteres
primero y tercero de la cadena. Por ejemplo,
primeroTercero "abel" [(('a','e'),"l")]
primeroTercero "ab" []
primeroTercero :: Analizador (Char,Char)
primeroTercero =
elemento >*> x ->
elemento >*> _ ->
elemento >*> y ->
resultado (x,y)
10 / 37
IM Tema 12: Analizadores sintácticos funcionales
Composición de analizadores sintácticos
Elección de analizadores sintácticos
Tema 12: Analizadores sintácticos funcionales
1. Analizadores sintácticos
2. El tipo de los analizadores sintácticos
3. Analizadores sintácticos básicos
4. Composición de analizadores sintácticos
Secuenciación de analizadores sintácticos
Elección de analizadores sintácticos
5. Primitivas derivadas
6. Tratamiento de los espacios
11 / 37
IM Tema 12: Analizadores sintácticos funcionales
Composición de analizadores sintácticos
Elección de analizadores sintácticos
Elección de analizadores sintácticos
((p +++ q) e) analiza e con p y si falla analiza e con q. Por
ejemplo,
Main*> analiza (elemento +++ resultado 'd') "abc"
[('a',"bc")]
Main*> analiza (fallo +++ resultado 'd') "abc"
[('d',"abc")]
Main*> analiza (fallo +++ fallo) "abc"
[]
(+++) :: Analizador a -> Analizador a -> Analizador a
p +++ q = ent -> case analiza p ent of
[] -> analiza q ent
[(v,sal)] -> [(v,sal)]
12 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas: sat
(sat p) es el analizador que consume un elemento si dicho
elemento cumple la propiedad p y falla en caso contrario. Por
ejemplo,
analiza (sat isLower) "hola" [('h',"ola")]
analiza (sat isLower) "Hola" []
sat :: (Char -> Bool) -> Analizador Char
sat p = elemento >*> x ->
if p x then resultado x else fallo
13 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
digito analiza si el primer carácter es un dígito. Por ejemplo,
analiza digito "123" [('1',"23")]
analiza digito "uno" []
digito :: Analizador Char
digito = sat isDigit
minuscula analiza si el primer carácter es una letra minúscula.
Por ejemplo,
analiza minuscula "eva" [('e',"va")]
analiza minuscula "Eva" []
minuscula :: Analizador Char
minuscula = sat isLower
14 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
mayuscula analiza si el primer carácter es una letra mayúscula.
Por ejemplo,
analiza mayuscula "Eva" [('E',"va")]
analiza mayuscula "eva" []
mayuscula :: Analizador Char
mayuscula = sat isUpper
letra analiza si el primer carácter es una letra. Por ejemplo,
analiza letra "Eva" [('E',"va")]
analiza letra "eva" [('e',"va")]
analiza letra "123" []
letra :: Analizador Char
letra = sat isAlpha
15 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
alfanumerico analiza si el primer carácter es una letra o un
número. Por ejemplo,
analiza alfanumerico "Eva" [('E',"va")]
analiza alfanumerico "eva" [('e',"va")]
analiza alfanumerico "123" [('1',"23")]
analiza alfanumerico " 123" []
alfanumerico :: Analizador Char
alfanumerico = sat isAlphaNum
16 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
(caracter x) analiza si el primer carácter es igual al carácter x.
Por ejemplo,
analiza (caracter 'E') "Eva" [('E',"va")]
analiza (caracter 'E') "eva" []
caracter :: Char -> Analizador Char
caracter x = sat (== x)
17 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
(cadena c) analiza si empieza con la cadena c. Por ejemplo,
analiza (cadena "abc") "abcdef" [("abc","def")]
analiza (cadena "abc") "abdcef" []
cadena :: String -> Analizador String
cadena [] = resultado []
cadena (x:xs) = caracter x >*> x ->
cadena xs >*> xs ->
resultado (x:xs)
18 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
varios p aplica el analizador p cero o más veces. Por ejemplo,
analiza (varios digito) "235abc" [("235","abc")]
analiza (varios digito) "abc235" [("","abc235")]
varios :: Analizador a -> Analizador [a]
varios p = varios1 p +++ resultado []
varios1 p aplica el analizador p una o más veces. Por ejemplo,
analiza (varios1 digito) "235abc" [("235","abc")]
analiza (varios1 digito) "abc235" []
varios1 :: Analizador a -> Analizador [a]
varios1 p = p >*> v ->
varios p >*> vs ->
resultado (v:vs)
19 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
ident analiza si comienza con un identificador (i.e. una cadena
que comienza con una letra minúscula seguida por caracteres
alfanuméricos). Por ejemplo,
Main*> analiza ident "lunes12 de Ene"
[("lunes12"," de Ene")]
Main*> analiza ident "Lunes12 de Ene"
[]
ident :: Analizador String
ident = minuscula >*> x ->
varios alfanumerico >*> xs ->
resultado (x:xs)
20 / 37
IM Tema 12: Analizadores sintácticos funcionales
Primitivas derivadas
Primitivas derivadas
nat analiza si comienza con un número natural. Por ejemplo,
analiza nat "14DeAbril" [(14,"DeAbril")]
analiza nat " 14DeAbril" []
nat :: Analizador Int
nat = varios1 digito >*> xs ->
resultado (read xs)
espacio analiza si comienza con espacios en blanco. Por
ejemplo,
analiza espacio " a b c" [((),"a b c")]
espacio :: Analizador ()
espacio = varios (sat isSpace) >*> _ ->
resultado ()
21 / 37
IM Tema 12: Analizadores sintácticos funcionales
Tratamiento de los espacios
Tratamiento de los espacios
unidad p ignora los espacios en blanco y aplica el analizador p.
Por ejemplo,
Main*> analiza (unidad nat) " 14DeAbril"
[(14,"DeAbril")]
Main*> analiza (unidad nat) " 14 DeAbril"
[(14,"DeAbril")]
unidad :: Analizador a -> Analizador a
unidad p = espacio >*> _ ->
p >*> v ->
espacio >*> _ ->
resultado v
22 / 37
IM Tema 12: Analizadores sintácticos funcionales
Tratamiento de los espacios
Tratamiento de los espacios
identificador analiza un identificador ignorando los espacios
delante y detrás. Por ejemplo,
Main*> analiza identificador " lunes12 de Ene"
[("lunes12","de Ene")]
identificador :: Analizador String
identificador = unidad ident
natural analiza un número natural ignorando los espacios
delante y detrás. Por ejemplo,
analiza natural " 14DeAbril" [(14,"DeAbril")]
natural :: Analizador Int
natural = unidad nat
23 / 37
IM Tema 12: Analizadores sintácticos funcionales
Tratamiento de los espacios
Tratamiento de los espacios
(simbolo xs) analiza la cadena xs ignorando los espacios
delante y detrás. Por ejemplo,
Main*> analiza (simbolo "abc") " abcdef"
[("abc","def")]
simbolo :: String -> Analizador String
simbolo xs = unidad (cadena xs)
24 / 37
IM Tema 12: Analizadores sintácticos funcionales
Tratamiento de los espacios
Tratamiento de los espacios
listaNat analiza una lista de naturales ignorando los espacios.
Por ejemplo,
Main*> analiza listaNat " [ 2, 3, 5 ]"
[([2,3,5],"")]
Main*> analiza listaNat " [ 2, 3,]"
[]
listaNat :: Analizador [Int]
listaNat = simbolo "[" >*> _ ->
natural >*> n ->
varios (simbolo "," >*> _ ->
natural) >*> ns ->
simbolo "]" >*> _ ->
resultado (n:ns)
25 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Expresiones aritméticas
Consideramos expresiones aritméticas:
construidas con números, operaciones (+ y ∗) y paréntesis.
+ y ∗ asocian por la derecha.
∗ tiene más prioridad que +.
Ejemplos:
2 + 3 + 5 representa a 2 + (3 + 5).
2 ∗ 3 + 5 representa a (2 ∗ 3) + 5.
26 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Gramáticas de las expresiones aritméticas: Gramática 1
Gramática 1 de las expresiones aritméticas:
expr ::= expr + expr | expr ∗ expr | (expr) | nat
nat ::= 0 | 1 | 2 | . . .
La gramática 1 no considera prioridad:
acepta 2 + 3 ∗ 5 como (2 + 3) ∗ 5 y como 2 + (3 ∗ 5)
La gramática 1 no considera asociatividad:
acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5)
La gramática 1 es ambigua.
27 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Gramáticas de las expresiones aritméticas: Gramática 2
Gramática 2 de las expresiones aritméticas (con prioridad):
expr ::= expr + expr | term
term ::= term ∗ term | factor
factor ::= (expr) | nat
nat ::= 0 | 1 | 2 | . . .
La gramática 2 sí considera prioridad:
acepta 2 + 3 ∗ 5 sólo como 2 + (3 ∗ 5)
La gramática 2 no considera asociatividad:
acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5)
La gramática 2 es ambigua.
28 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Árbol de análisis sintáctico de 2 ∗ 3 + 5 con la gramática 2
expr
expr
term
term
factor
nat
2
∗ term
factor
nat
3
+ expr
term
factor
nat
3
29 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Gramáticas de las expresiones aritméticas: Gramática 3
Gramática 3 de las expresiones aritméticas:
expr ::= term + expr | term
term ::= factor ∗ term | factor
factor ::= (expr) | nat
nat ::= 0 | 1 | 2 | . . .
La gramática 3 sí considera prioridad:
acepta 2 + 3 ∗ 5 sólo como 2 + (3 ∗ 5)
La gramática 3 sí considera asociatividad:
acepta 2 + 3 + 5 como 2 + (3 + 5)
La gramática 3 no es ambigua (i.e. es libre de contexto).
30 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Árbol de análisis sintáctico de 2 + 3 + 5 con la gramática 3
expr
term
factor
nat
2
+ expr
term
factor
nat
3
+ expr
term
factor
nat
4
31 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Gramáticas de las expresiones aritméticas: Gramática 4
La gramática 4 se obtiene simplificando la gramática 3:
expr ::= term (+ expr | )
term ::= factor (∗ term | )
factor ::= (expr) | nat
nat ::= 0 | 1 | 2 | . . .
donde es la cadena vacía.
La gramática 4 no es ambigua.
La gramática 4 es la que se usará para escribir el analizador de
expresiones aritméticas.
32 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Analizador de expresiones aritméticas
expr analiza una expresión aritmética devolviendo su valor. Por
ejemplo,
analiza expr "2*3+5" [(11,"")]
analiza expr "2*(3+5)" [(16,"")]
analiza expr "2+3*5" [(17,"")]
analiza expr "2*3+5abc" [(11,"abc")]
expr :: Analizador Int
expr = term >*> t ->
(simbolo "+" >*> _ ->
expr >*> e ->
resultado (t+e))
+++ resultado t
33 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Analizador de expresiones aritméticas
averbterm analiza un término de una expresión aritmética
devolviendo su valor. Por ejemplo,
analiza term "2*3+5" [(6,"+5")]
analiza term "2+3*5" [(2,"+3*5")]
analiza term "(2+3)*5+7" [(25,"+7")]
term :: Analizador Int
term = factor >*> f ->
(simbolo "*" >*> _ ->
term >*> t ->
resultado (f*t))
+++ resultado f
34 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Analizador de expresiones aritméticas
factor analiza un factor de una expresión aritmética devolviendo
su valor. Por ejemplo,
analiza factor "2*3+5" [(2,"*3+5")]
analiza factor "(2+3)*5" [(5,"*5")]
analiza factor "(2+3*7)*5" [(23,"*5")]
factor :: Analizador Int
factor = (simbolo "(" >*> _ ->
expr >*> e ->
simbolo ")" >*> _ ->
resultado e)
+++ natural
35 / 37
IM Tema 12: Analizadores sintácticos funcionales
Analizador de expresiones aritméticas
Analizador de expresiones aritméticas
(valor cs) analiza la cadena cs devolviendo su valor si es una
expresión aritmética y un mensaje de error en caso contrario. Por
ejemplo,
valor "2*3+5" 11
valor "2*(3+5)" 16
valor "2 * 3 + 5" 11
valor "2*3x" *** Exception: sin usar x
valor "-1" *** Exception: entrada no valida
valor :: String -> Int
valor xs = case (analiza expr xs) of
[(n,[])] -> n
[(_,sal)] -> error ("sin usar " ++ sal)
[] -> error "entrada no valida"
36 / 37
IM Tema 12: Analizadores sintácticos funcionales
Bibliografía
Bibliografía
1. R. Bird. Introducción a la programación funcional con Haskell.
Prentice Hall, 2000.
Cap. 11: Análisis sintáctico.
2. G. Hutton Programming in Haskell. Cambridge University Press,
2007.
Cap. 8: Functional parsers.
3. G. Hutton y E. Meijer. Monadic Parser Combinators. Technical
Report NOTTCS–TR–96–4, Department of Computer Science,
University of Nottingham, 1996.
4. G. Hutton y E. Meijer. Monadic Parsing in Haskell. Journal of
Functional Programming, 8(4): 437—444, 1998.
5. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
con Haskell. Thompson, 2004.
Cap. 14: Analizadores.
37 / 37

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

jaisan
jaisanjaisan
jaisan
 
Tema 10-1x2
Tema 10-1x2Tema 10-1x2
Tema 10-1x2
 
Tema 0 Repaso Programación en Java
Tema 0 Repaso Programación en JavaTema 0 Repaso Programación en Java
Tema 0 Repaso Programación en Java
 
Tema 8: Razonamiento sobre programas Haskell.
Tema 8: Razonamiento sobre programas Haskell.Tema 8: Razonamiento sobre programas Haskell.
Tema 8: Razonamiento sobre programas Haskell.
 
2 algoritmos-1
2 algoritmos-12 algoritmos-1
2 algoritmos-1
 
Algoritmos y Estructura de Datos
Algoritmos y Estructura de DatosAlgoritmos y Estructura de Datos
Algoritmos y Estructura de Datos
 
1. vers. cap-3_tipos_dedatos
1. vers. cap-3_tipos_dedatos1. vers. cap-3_tipos_dedatos
1. vers. cap-3_tipos_dedatos
 
Matlab presentacion enero2012
Matlab presentacion enero2012Matlab presentacion enero2012
Matlab presentacion enero2012
 
Funciones
FuncionesFunciones
Funciones
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Estructurada 7
Estructurada 7Estructurada 7
Estructurada 7
 
Introducción a la programación y la informática. Tema 6
Introducción a la programación y la informática. Tema 6Introducción a la programación y la informática. Tema 6
Introducción a la programación y la informática. Tema 6
 
Clase 03-matlab
Clase 03-matlabClase 03-matlab
Clase 03-matlab
 
arrays
arraysarrays
arrays
 
Arrays unidimensionales
Arrays unidimensionalesArrays unidimensionales
Arrays unidimensionales
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntos
 
Tipos basicos
Tipos basicosTipos basicos
Tipos basicos
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenador
 
Praedo ii
Praedo iiPraedo ii
Praedo ii
 

Similar a Tema 12: Analizadores sintácticos funcionales.

Analisis sintactico10
Analisis sintactico10Analisis sintactico10
Analisis sintactico10Emanuel Gs
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9Eudris Cabrera
 
Fundamentos De Algoritmia
Fundamentos De AlgoritmiaFundamentos De Algoritmia
Fundamentos De Algoritmiacckokyco
 
Fundamentos de programacion
Fundamentos de programacionFundamentos de programacion
Fundamentos de programacionSneydert Jhenz
 
Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10Andres Garcia Garcia
 
introducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxintroducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxErisbeymarin
 
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programaciónfpcanizaresg
 
Unidad4 analisis-semantico
Unidad4 analisis-semanticoUnidad4 analisis-semantico
Unidad4 analisis-semanticoInfomania pro
 
Compilador Usando Jflex y Cup
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cupditopo
 

Similar a Tema 12: Analizadores sintácticos funcionales. (15)

Analisis sintactico10
Analisis sintactico10Analisis sintactico10
Analisis sintactico10
 
Lenguaje Lisp
Lenguaje LispLenguaje Lisp
Lenguaje Lisp
 
Ejercicios Python parte 4
Ejercicios Python parte 4Ejercicios Python parte 4
Ejercicios Python parte 4
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9
 
Fundamentos De Algoritmia
Fundamentos De AlgoritmiaFundamentos De Algoritmia
Fundamentos De Algoritmia
 
Fundamentos de programacion
Fundamentos de programacionFundamentos de programacion
Fundamentos de programacion
 
Practica i prolog
Practica i prologPractica i prolog
Practica i prolog
 
Haskell
HaskellHaskell
Haskell
 
Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10
 
introducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptxintroducción a la programación utilizando C++.pptx
introducción a la programación utilizando C++.pptx
 
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programación
 
Analisis Sintactico
Analisis SintacticoAnalisis Sintactico
Analisis Sintactico
 
clases de herramientas lorenita
clases de herramientas lorenitaclases de herramientas lorenita
clases de herramientas lorenita
 
Unidad4 analisis-semantico
Unidad4 analisis-semanticoUnidad4 analisis-semantico
Unidad4 analisis-semantico
 
Compilador Usando Jflex y Cup
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cup
 

Más de José A. Alonso

I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalJosé A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalJosé A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosJosé A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalJosé A. Alonso
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellJosé A. Alonso
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalJosé A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologJosé A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesJosé A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automáticoJosé A. Alonso
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicionalJosé A. Alonso
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellJosé A. Alonso
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasJosé A. Alonso
 
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.José A. Alonso
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenJosé A. Alonso
 

Más de José A. Alonso (20)

I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulas
 
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer orden
 

Último

Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfvictorbeltuce
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxdanalikcruz2000
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfAlfredoRamirez953210
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfBIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfCESARMALAGA4
 
PPT_Formación integral y educación CRESE (1).pdf
PPT_Formación integral y educación CRESE (1).pdfPPT_Formación integral y educación CRESE (1).pdf
PPT_Formación integral y educación CRESE (1).pdfEDILIAGAMBOA
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxJUANSIMONPACHIN
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOweislaco
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIAAbelardoVelaAlbrecht1
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...JAVIER SOLIS NOYOLA
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfromanmillans
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxMartín Ramírez
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressionsConsueloSantana3
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 

Último (20)

PPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptxPPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptx
 
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
 
VISITA À PROTEÇÃO CIVIL _
VISITA À PROTEÇÃO CIVIL                  _VISITA À PROTEÇÃO CIVIL                  _
VISITA À PROTEÇÃO CIVIL _
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdfBIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
BIOLOGIA_banco de preguntas_editorial icfes examen de estado .pdf
 
PPT_Formación integral y educación CRESE (1).pdf
PPT_Formación integral y educación CRESE (1).pdfPPT_Formación integral y educación CRESE (1).pdf
PPT_Formación integral y educación CRESE (1).pdf
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
 
DIA INTERNACIONAL DAS FLORESTAS .
DIA INTERNACIONAL DAS FLORESTAS         .DIA INTERNACIONAL DAS FLORESTAS         .
DIA INTERNACIONAL DAS FLORESTAS .
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdf
 
TL/CNL – 2.ª FASE .
TL/CNL – 2.ª FASE                       .TL/CNL – 2.ª FASE                       .
TL/CNL – 2.ª FASE .
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressions
 
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdfTema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 

Tema 12: Analizadores sintácticos funcionales.

  • 1. Tema 12: Analizadores sintácticos funcionales Informática (2014–15) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 12: Analizadores sintácticos funcionales Tema 12: Analizadores sintácticos funcionales 1. Analizadores sintácticos 2. El tipo de los analizadores sintácticos 3. Analizadores sintácticos básicos 4. Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Elección de analizadores sintácticos 5. Primitivas derivadas 6. Tratamiento de los espacios 7. Analizador de expresiones aritméticas 2 / 37
  • 3. IM Tema 12: Analizadores sintácticos funcionales Analizadores sintácticos Analizadores sintácticos Un analizador sintáctico es un programa que analiza textos para determinar su estructura sintáctica. Ejemplo de análisis sintáctico aritmético: La estructura sintáctica de la cadena "2*3+4" es el árbol + * 2 3 4 El análisis sintáctico forma parte del preprocesamiento en la mayoría de las aplicaciones reales. 3 / 37
  • 4. IM Tema 12: Analizadores sintácticos funcionales El tipo de los analizadores sintácticos Opciones para el tipo de los analizadores sintácticos Opción inicial: type Analizador = String -> Tree Con la parte no analizada: type Analizador = String -> (Tree,String) Con todos los análisis: type Analizador = String -> [(Tree,String)] Con estructuras arbitrarias: type Analizador a = String -> [(a,String)] Simplificación: analizadores que fallan o sólo dan un análisis. 4 / 37
  • 5. IM Tema 12: Analizadores sintácticos funcionales Analizadores sintácticos básicos Analizadores sintácticos básicos: resultado (analiza a cs) analiza la cadena cs mediante el analizador a. Por ejemplo, analiza :: Analizador a -> String -> [(a,String)] analiza a cs = a cs El analizador resultado v siempre tiene éxito, devuelve v y no consume nada. Por ejemplo, ghci> analiza (resultado 1) "abc" [(1,"abc")] resultado :: a -> Analizador a resultado v = xs -> [(v,xs)] 5 / 37
  • 6. IM Tema 12: Analizadores sintácticos funcionales Analizadores sintácticos básicos Analizadores sintácticos básicos: fallo El analizador fallo siempre falla. Por ejemplo, ghci> analiza fallo "abc" [] fallo :: Analizador a fallo = xs -> [] 6 / 37
  • 7. IM Tema 12: Analizadores sintácticos funcionales Analizadores sintácticos básicos Analizadores sintácticos básicos: elemento El analizador elemento falla si la cadena es vacía y consume el primer elemento en caso contrario. Por ejemplo, ghci> analiza elemento "" [] ghci> analiza elemento "abc" [('a',"bc")] elemento :: Analizador Char elemento = xs -> case xs of [] -> [] (x:xs) -> [(x , xs)] 7 / 37
  • 8. IM Tema 12: Analizadores sintácticos funcionales Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Tema 12: Analizadores sintácticos funcionales 1. Analizadores sintácticos 2. El tipo de los analizadores sintácticos 3. Analizadores sintácticos básicos 4. Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Elección de analizadores sintácticos 5. Primitivas derivadas 6. Tratamiento de los espacios 8 / 37
  • 9. IM Tema 12: Analizadores sintácticos funcionales Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Secuenciación de analizadores sintácticos ((p >*> f) e) falla si el análisis de e por p falla, en caso contrario, se obtiene un valor (v) y una salida (s), se aplica la función f al valor v obteniéndose un nuevo analizador con el que se analiza la salida s. infixr 5 >*> (>*>) :: Analizador a -> (a -> Analizador b) -> Analizador b p >*> f = ent -> case analiza p ent of [] -> [] [(v,sal)] -> analiza (f v) sal 9 / 37
  • 10. IM Tema 12: Analizadores sintácticos funcionales Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Secuenciación de analizadores sintácticos primeroTercero es un analizador que devuelve los caracteres primero y tercero de la cadena. Por ejemplo, primeroTercero "abel" [(('a','e'),"l")] primeroTercero "ab" [] primeroTercero :: Analizador (Char,Char) primeroTercero = elemento >*> x -> elemento >*> _ -> elemento >*> y -> resultado (x,y) 10 / 37
  • 11. IM Tema 12: Analizadores sintácticos funcionales Composición de analizadores sintácticos Elección de analizadores sintácticos Tema 12: Analizadores sintácticos funcionales 1. Analizadores sintácticos 2. El tipo de los analizadores sintácticos 3. Analizadores sintácticos básicos 4. Composición de analizadores sintácticos Secuenciación de analizadores sintácticos Elección de analizadores sintácticos 5. Primitivas derivadas 6. Tratamiento de los espacios 11 / 37
  • 12. IM Tema 12: Analizadores sintácticos funcionales Composición de analizadores sintácticos Elección de analizadores sintácticos Elección de analizadores sintácticos ((p +++ q) e) analiza e con p y si falla analiza e con q. Por ejemplo, Main*> analiza (elemento +++ resultado 'd') "abc" [('a',"bc")] Main*> analiza (fallo +++ resultado 'd') "abc" [('d',"abc")] Main*> analiza (fallo +++ fallo) "abc" [] (+++) :: Analizador a -> Analizador a -> Analizador a p +++ q = ent -> case analiza p ent of [] -> analiza q ent [(v,sal)] -> [(v,sal)] 12 / 37
  • 13. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas: sat (sat p) es el analizador que consume un elemento si dicho elemento cumple la propiedad p y falla en caso contrario. Por ejemplo, analiza (sat isLower) "hola" [('h',"ola")] analiza (sat isLower) "Hola" [] sat :: (Char -> Bool) -> Analizador Char sat p = elemento >*> x -> if p x then resultado x else fallo 13 / 37
  • 14. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas digito analiza si el primer carácter es un dígito. Por ejemplo, analiza digito "123" [('1',"23")] analiza digito "uno" [] digito :: Analizador Char digito = sat isDigit minuscula analiza si el primer carácter es una letra minúscula. Por ejemplo, analiza minuscula "eva" [('e',"va")] analiza minuscula "Eva" [] minuscula :: Analizador Char minuscula = sat isLower 14 / 37
  • 15. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas mayuscula analiza si el primer carácter es una letra mayúscula. Por ejemplo, analiza mayuscula "Eva" [('E',"va")] analiza mayuscula "eva" [] mayuscula :: Analizador Char mayuscula = sat isUpper letra analiza si el primer carácter es una letra. Por ejemplo, analiza letra "Eva" [('E',"va")] analiza letra "eva" [('e',"va")] analiza letra "123" [] letra :: Analizador Char letra = sat isAlpha 15 / 37
  • 16. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas alfanumerico analiza si el primer carácter es una letra o un número. Por ejemplo, analiza alfanumerico "Eva" [('E',"va")] analiza alfanumerico "eva" [('e',"va")] analiza alfanumerico "123" [('1',"23")] analiza alfanumerico " 123" [] alfanumerico :: Analizador Char alfanumerico = sat isAlphaNum 16 / 37
  • 17. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas (caracter x) analiza si el primer carácter es igual al carácter x. Por ejemplo, analiza (caracter 'E') "Eva" [('E',"va")] analiza (caracter 'E') "eva" [] caracter :: Char -> Analizador Char caracter x = sat (== x) 17 / 37
  • 18. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas (cadena c) analiza si empieza con la cadena c. Por ejemplo, analiza (cadena "abc") "abcdef" [("abc","def")] analiza (cadena "abc") "abdcef" [] cadena :: String -> Analizador String cadena [] = resultado [] cadena (x:xs) = caracter x >*> x -> cadena xs >*> xs -> resultado (x:xs) 18 / 37
  • 19. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas varios p aplica el analizador p cero o más veces. Por ejemplo, analiza (varios digito) "235abc" [("235","abc")] analiza (varios digito) "abc235" [("","abc235")] varios :: Analizador a -> Analizador [a] varios p = varios1 p +++ resultado [] varios1 p aplica el analizador p una o más veces. Por ejemplo, analiza (varios1 digito) "235abc" [("235","abc")] analiza (varios1 digito) "abc235" [] varios1 :: Analizador a -> Analizador [a] varios1 p = p >*> v -> varios p >*> vs -> resultado (v:vs) 19 / 37
  • 20. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas ident analiza si comienza con un identificador (i.e. una cadena que comienza con una letra minúscula seguida por caracteres alfanuméricos). Por ejemplo, Main*> analiza ident "lunes12 de Ene" [("lunes12"," de Ene")] Main*> analiza ident "Lunes12 de Ene" [] ident :: Analizador String ident = minuscula >*> x -> varios alfanumerico >*> xs -> resultado (x:xs) 20 / 37
  • 21. IM Tema 12: Analizadores sintácticos funcionales Primitivas derivadas Primitivas derivadas nat analiza si comienza con un número natural. Por ejemplo, analiza nat "14DeAbril" [(14,"DeAbril")] analiza nat " 14DeAbril" [] nat :: Analizador Int nat = varios1 digito >*> xs -> resultado (read xs) espacio analiza si comienza con espacios en blanco. Por ejemplo, analiza espacio " a b c" [((),"a b c")] espacio :: Analizador () espacio = varios (sat isSpace) >*> _ -> resultado () 21 / 37
  • 22. IM Tema 12: Analizadores sintácticos funcionales Tratamiento de los espacios Tratamiento de los espacios unidad p ignora los espacios en blanco y aplica el analizador p. Por ejemplo, Main*> analiza (unidad nat) " 14DeAbril" [(14,"DeAbril")] Main*> analiza (unidad nat) " 14 DeAbril" [(14,"DeAbril")] unidad :: Analizador a -> Analizador a unidad p = espacio >*> _ -> p >*> v -> espacio >*> _ -> resultado v 22 / 37
  • 23. IM Tema 12: Analizadores sintácticos funcionales Tratamiento de los espacios Tratamiento de los espacios identificador analiza un identificador ignorando los espacios delante y detrás. Por ejemplo, Main*> analiza identificador " lunes12 de Ene" [("lunes12","de Ene")] identificador :: Analizador String identificador = unidad ident natural analiza un número natural ignorando los espacios delante y detrás. Por ejemplo, analiza natural " 14DeAbril" [(14,"DeAbril")] natural :: Analizador Int natural = unidad nat 23 / 37
  • 24. IM Tema 12: Analizadores sintácticos funcionales Tratamiento de los espacios Tratamiento de los espacios (simbolo xs) analiza la cadena xs ignorando los espacios delante y detrás. Por ejemplo, Main*> analiza (simbolo "abc") " abcdef" [("abc","def")] simbolo :: String -> Analizador String simbolo xs = unidad (cadena xs) 24 / 37
  • 25. IM Tema 12: Analizadores sintácticos funcionales Tratamiento de los espacios Tratamiento de los espacios listaNat analiza una lista de naturales ignorando los espacios. Por ejemplo, Main*> analiza listaNat " [ 2, 3, 5 ]" [([2,3,5],"")] Main*> analiza listaNat " [ 2, 3,]" [] listaNat :: Analizador [Int] listaNat = simbolo "[" >*> _ -> natural >*> n -> varios (simbolo "," >*> _ -> natural) >*> ns -> simbolo "]" >*> _ -> resultado (n:ns) 25 / 37
  • 26. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Expresiones aritméticas Consideramos expresiones aritméticas: construidas con números, operaciones (+ y ∗) y paréntesis. + y ∗ asocian por la derecha. ∗ tiene más prioridad que +. Ejemplos: 2 + 3 + 5 representa a 2 + (3 + 5). 2 ∗ 3 + 5 representa a (2 ∗ 3) + 5. 26 / 37
  • 27. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Gramáticas de las expresiones aritméticas: Gramática 1 Gramática 1 de las expresiones aritméticas: expr ::= expr + expr | expr ∗ expr | (expr) | nat nat ::= 0 | 1 | 2 | . . . La gramática 1 no considera prioridad: acepta 2 + 3 ∗ 5 como (2 + 3) ∗ 5 y como 2 + (3 ∗ 5) La gramática 1 no considera asociatividad: acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5) La gramática 1 es ambigua. 27 / 37
  • 28. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Gramáticas de las expresiones aritméticas: Gramática 2 Gramática 2 de las expresiones aritméticas (con prioridad): expr ::= expr + expr | term term ::= term ∗ term | factor factor ::= (expr) | nat nat ::= 0 | 1 | 2 | . . . La gramática 2 sí considera prioridad: acepta 2 + 3 ∗ 5 sólo como 2 + (3 ∗ 5) La gramática 2 no considera asociatividad: acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5) La gramática 2 es ambigua. 28 / 37
  • 29. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Árbol de análisis sintáctico de 2 ∗ 3 + 5 con la gramática 2 expr expr term term factor nat 2 ∗ term factor nat 3 + expr term factor nat 3 29 / 37
  • 30. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Gramáticas de las expresiones aritméticas: Gramática 3 Gramática 3 de las expresiones aritméticas: expr ::= term + expr | term term ::= factor ∗ term | factor factor ::= (expr) | nat nat ::= 0 | 1 | 2 | . . . La gramática 3 sí considera prioridad: acepta 2 + 3 ∗ 5 sólo como 2 + (3 ∗ 5) La gramática 3 sí considera asociatividad: acepta 2 + 3 + 5 como 2 + (3 + 5) La gramática 3 no es ambigua (i.e. es libre de contexto). 30 / 37
  • 31. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Árbol de análisis sintáctico de 2 + 3 + 5 con la gramática 3 expr term factor nat 2 + expr term factor nat 3 + expr term factor nat 4 31 / 37
  • 32. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Gramáticas de las expresiones aritméticas: Gramática 4 La gramática 4 se obtiene simplificando la gramática 3: expr ::= term (+ expr | ) term ::= factor (∗ term | ) factor ::= (expr) | nat nat ::= 0 | 1 | 2 | . . . donde es la cadena vacía. La gramática 4 no es ambigua. La gramática 4 es la que se usará para escribir el analizador de expresiones aritméticas. 32 / 37
  • 33. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Analizador de expresiones aritméticas expr analiza una expresión aritmética devolviendo su valor. Por ejemplo, analiza expr "2*3+5" [(11,"")] analiza expr "2*(3+5)" [(16,"")] analiza expr "2+3*5" [(17,"")] analiza expr "2*3+5abc" [(11,"abc")] expr :: Analizador Int expr = term >*> t -> (simbolo "+" >*> _ -> expr >*> e -> resultado (t+e)) +++ resultado t 33 / 37
  • 34. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Analizador de expresiones aritméticas averbterm analiza un término de una expresión aritmética devolviendo su valor. Por ejemplo, analiza term "2*3+5" [(6,"+5")] analiza term "2+3*5" [(2,"+3*5")] analiza term "(2+3)*5+7" [(25,"+7")] term :: Analizador Int term = factor >*> f -> (simbolo "*" >*> _ -> term >*> t -> resultado (f*t)) +++ resultado f 34 / 37
  • 35. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Analizador de expresiones aritméticas factor analiza un factor de una expresión aritmética devolviendo su valor. Por ejemplo, analiza factor "2*3+5" [(2,"*3+5")] analiza factor "(2+3)*5" [(5,"*5")] analiza factor "(2+3*7)*5" [(23,"*5")] factor :: Analizador Int factor = (simbolo "(" >*> _ -> expr >*> e -> simbolo ")" >*> _ -> resultado e) +++ natural 35 / 37
  • 36. IM Tema 12: Analizadores sintácticos funcionales Analizador de expresiones aritméticas Analizador de expresiones aritméticas (valor cs) analiza la cadena cs devolviendo su valor si es una expresión aritmética y un mensaje de error en caso contrario. Por ejemplo, valor "2*3+5" 11 valor "2*(3+5)" 16 valor "2 * 3 + 5" 11 valor "2*3x" *** Exception: sin usar x valor "-1" *** Exception: entrada no valida valor :: String -> Int valor xs = case (analiza expr xs) of [(n,[])] -> n [(_,sal)] -> error ("sin usar " ++ sal) [] -> error "entrada no valida" 36 / 37
  • 37. IM Tema 12: Analizadores sintácticos funcionales Bibliografía Bibliografía 1. R. Bird. Introducción a la programación funcional con Haskell. Prentice Hall, 2000. Cap. 11: Análisis sintáctico. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 8: Functional parsers. 3. G. Hutton y E. Meijer. Monadic Parser Combinators. Technical Report NOTTCS–TR–96–4, Department of Computer Science, University of Nottingham, 1996. 4. G. Hutton y E. Meijer. Monadic Parsing in Haskell. Journal of Functional Programming, 8(4): 437—444, 1998. 5. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 14: Analizadores. 37 / 37