p rocesadores de l enguaje analizador sintáctico ll1 pablo piÑeiro rey 20321143 marcos zamareÑo...

25
PROCESADORES DE LENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

Upload: ernesto-bedoya

Post on 14-Apr-2015

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

PROCESADORES DE LENGUAJEAnalizador Sintáctico LL1

Pablo PIÑEIRO REY 20321143

Marcos ZAMAREÑO JUANAS 20517195

Page 2: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

ÍNDICE

0. Objetivos 1. Casos de uso 2. Diagrama de clases 3. Principales decisiones de diseño 4. Problemas encontrados 5. Conclusiones 6. Ejemplo práctico

2

Page 3: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

0. OBJETIVOS

Realizar el análisis sintáctico de una cadena a partir del previo reconocimiento y análisis de una gramática

3

Page 4: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

1. CASOS DE USO

Para nuestra práctica hemos identificado 3 casos de uso:

4

Construir reconocedor

Salir

Introducir Fichero

Comprobar Cadena

Page 5: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

1. CASOS DE USO

Introducir fichero: El sistema solicita una ruta y una vez introducida carga el fichero y genera la gramática correspondiente.

Comprobar cadena: Igualmente el sistema solicita una ruta y se genera otro fichero en el cual se mostrará el resultado obtenido de la comprobación.

Salir: Sale de la aplicación.

5

Page 6: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES

Nuestras clases se encuentran divididas en distintos paquetes.

Io. Léxico. Principal. Útil. Sintáctico

6

Page 7: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (II)

Io

class io

GestorFichero

- archivo: File- fr: FileReader- laux: LinkedList<String>- producciones: LinkedList<Nodo>~ pw: PrintWriter- stdIn: BufferedReader = new BufferedRea...

+ escribirLL1(String) : void+ GestorFichero()- leerFichero() : void+ pedirRuta() : String+ tokenizar() : LinkedList<Nodo>

Salida

- stdIn: BufferedReader = new BufferedRea...

+ menu() : int+ Salida()

7

Page 8: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

DIAGRAMA DE CLASES (III)

8

Page 9: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (IV)

Léxico:

9

Page 10: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

10

class lexico

AnalizadorLexico

# fichero: FileReader = null

+ AnalizadorLexico(String)+ lexico(LinkedList<Nodo>, Map<String, Map<String,LinkedList<String>>>) : void

Yytoken

+ id: int+ lexema: String+ linea: int

+ toString() : String~ Yytoken(int, String, int)

Yylex

- yychar: int- yycolumn: int+ YYEOF: int = -1 {readOnly}+ YYINITIAL: int = 0 {readOnly}- yyline: int- ZZ_ACTION: int ([]) = zzUnpackAction() {readOnly}- ZZ_ACTION_PACKED_0: String = "\1\1\1\2\1\3\1... {readOnly}- ZZ_ATTRIBUTE: int ([]) = zzUnpackAttribute() {readOnly}- ZZ_ATTRIBUTE_PACKED_0: String = "\1\1\1\11\2\1\5\11" {readOnly}- ZZ_BUFFERSIZE: int = 16384 {readOnly}- ZZ_CMAP: char ([]) = { 0, 0, ... {readOnly}- ZZ_ERROR_MSG: String ([]) = { "Unkown ... {readOnly}- ZZ_NO_MATCH: int = 1 {readOnly}- ZZ_PUSHBACK_2BIG: int = 2 {readOnly}- ZZ_ROWMAP: int ([]) = zzUnpackRowMap() {readOnly}- ZZ_ROWMAP_PACKED_0: String = "\0\0\0\10\0\20... {readOnly}- ZZ_TRANS: int ([]) = zzUnpackTrans() {readOnly}- ZZ_TRANS_PACKED_0: String = "\1\2\1\3\1\4\1... {readOnly}- ZZ_UNKNOWN_ERROR: int = 0 {readOnly}- zzAtBOL: boolean = true- zzAtEOF: boolean- zzBuffer: char ([]) = new char[ZZ_BUF...- zzCurrentPos: int- zzEndRead: int- zzLexicalState: int = YYINITIAL- zzMarkedPos: int- zzPushbackPos: int- zzReader: java.io.Reader- zzStartRead: int- zzState: int

+ yybegin(int) : void+ yycharat(int) : char+ yyclose() : void+ yylength() : int~ Yylex(java.io.Reader)~ Yylex(java.io.InputStream)+ yylex() : Yytoken+ yypushback(int) : void+ yyreset(java.io.Reader) : void+ yystate() : int+ yytext() : String- zzRefil l() : boolean- zzScanError(int) : void- zzUnpackAction() : int[]- zzUnpackAction(String, int, int[]) : int- zzUnpackAttribute() : int[]- zzUnpackAttribute(String, int, int[]) : int- zzUnpackRowMap() : int[]- zzUnpackRowMap(String, int, int[]) : int- zzUnpackTrans() : int[]- zzUnpackTrans(String, int, int[]) : int

Page 11: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (VI)

Métodos a destacar analizadorLéxico:

analizadorLexico(string) Constructor de la clase.

lexico: Método que se encarga de realizar el análisis léxico de nuestra cadena de entrada con la ayuda de la clase Yylex

11

Page 12: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (VII)

Principal

12

class principal

Principal

- existeGramatica: boolean = false- fichero: GestorFichero- producciones: LinkedList<Nodo>- stdIn: BufferedReader = new BufferedRea...

+ main(String[]) : void

Page 13: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (VIII)

Métodos a destacar Principal

main: Clase en la que encontramos el main desde el cual controlaremos la ejecución de nuestro programa guiando al usuario a través de una serie de menús.

13

Page 14: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (IX)

util

14

class util

Nodo

~ parteDerecha: String~ parteIzquierda: String

+ getParteDerecha() : String+ getParteIzquierda() : String+ Nodo()~ Nodo(String, String)+ setParteDerecha(String) : void

«property set»+ setparteIzquierda(String) : void

Page 15: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (X)

Nodo

Nodo(String,String) Método que crea un nodo a partir de dos strings que especifican la parte derecha e izquierda respectivamente.

getParteDerecha(): String Método para obtener la parte derecha de la producción.

set ParteIzquierda():void Método que nos permite almacenar un valor en la parte izquierda de la producción. 15

Page 16: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (XI)

Sintáctico

16

class sintactico

LL1

- analisis: Map<String, Map<String, LinkedList<String>>>- conjPrimero: Map<String, LinkedList<String>>- conjSiguiente: Map<String, LinkedList<String>>- error: boolean = false- fichero: GestorFichero- stdIn: BufferedReader = new BufferedRea...- stdOut: PrintWriter = new PrintWriter...

- algoritmoPrimero(String, LinkedList<Nodo>) : LinkedList<String>- algoritmoSiguiente(String, LinkedList<Nodo>, boolean) : void- calcularSiguiente(String, LinkedList<Nodo>, boolean, Nodo) : void+ construirTabla(LinkedList<Nodo>) : Map<String, Map<String, LinkedList<String>>>+ getError() : boolean+ inicializarTabla(LinkedList<Nodo>) : void+ LL1(GestorFichero)+ primero(LinkedList<Nodo>) : void- sacarParteDerecha(LinkedList<Nodo>, String) : ArrayList<String>- sacarParteIzquierda(LinkedList<Nodo>) : ArrayList<String>+ siguiente(LinkedList<Nodo>) : void

Page 17: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (XII) LL1: Paquete compuesto por una única clase LL1 encargada de

obtener el conjunto primero, siguiente, y tabla de análisis. Métodos a destacar.

LL1: Constructor de la clase. Se le pasa un objeto del tipo GestorFichero para que tenga todas las producciones que hemos leído del fichero de entrada.

sacarParteIzquierda: Método según el cual obtenemos los no terminales de nuestra gramática, aquellos que se encuentran a la izquierda.

sacarParteDerecha: Análogo al anterior.

Primero:Método encargado de obtener el conjunto primero de todos los elementos de la gramática.

algoritmoPrimero: Algoritmo que calcula el conjunto primero de un determinado no terminal. Como datos de entrada contamos con el no terminar y la lista de producciones.

17

Page 18: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

2. DIAGRAMA DE CLASES (XIII) siguiente: Método que calcula los conjuntos siguientes

siguientes de los no terminals de la gramatica, Como parámetro de entrada contamos con la lista de producciones.

algoritmoSiguiente: Algoritmo mediante el cual calculamos el conjunto siguiente de un no terminal dado. La variable inicial sirve para saber si es el símbolo inicial de la gramática ya que en ese caso hay que añadir siempre al conjunto siguiente lambda

calcularSiguiente: Algoritmo de ayuda para calcular el conjunto siguiente recursivamente. Como entrada tenemos el no terminal del cual estamos buscando el conjunto siguiente, la lista de producciones, una variable que nos indica si es el símbolo inicial y no un nodo que contiene el elemento anterior

inicializarTabla: Método que analiza la tabla de análisis. construirTabla: Método que nos permite construir la tabla 18

Page 19: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

3. PRINCIPALES DECISIONES DE DISEÑO (I)

19

Page 20: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

3. PRINCIPALES DECISIONES DE DISEÑO (II)

GIC La GIC se representara en dos partes:

La lista de No Terminales Representada pon una lista de Cadenas con todos

los NT La lista de Producciones

Representada pon una lista de Nodos. Cada Nodo contiene la parte izquierda de la

produccion (un NT) Cada Nodo contiene la parte derecha de la

produccion.

20

Page 21: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

3. PRINCIPALES DECISIONES DE DISEÑO (III)

Analisis Léxico Jlex Usado para comprobar si una cadena pertenece

a la gramática. Convierte los tokens en simbolos que pueda

reconocer el analizador. + SUMA * MULT ( PARENT_DER ) PARENT_IZQ 1,2,..,9,0,.. NUMERO a..z IDENTIFICADOR

21

Page 22: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

3. PRINCIPALES DECISIONES DE DISEÑO (IV)

Analisis Sintactico Obtiene los siguiente conjuntos

Conjunto primero. Conjunto siguiente. Conjunto prediccion.

Calcula la tabla de análisis sintactico.

Una vez tenemos la tabla de análisis sintáctico y la cadena a reconocer en la misma nomenclatura se comprueba si la cadena puede ser leída.

22

Page 23: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

4. PROBLEMAS ENCONTRADOS

Dificultad para la integración de Jlex en nuestro proyecto.

Dificultad para la correcta implementación del método calcularSiguiente.

Dificultad para trabajar con estructuras de tablas y listas de listas que hacen mucho mas complejas tanto para recorrerlas como para cualquier método de adición o substracción.

23

Page 24: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

5. CONCLUSIONES

Hemos podido comprobar como interactúan de forma práctica el analizador léxico con el sintáctico aunque sea a un nivel muy básico

24

Page 25: P ROCESADORES DE L ENGUAJE Analizador Sintáctico LL1 Pablo PIÑEIRO REY 20321143 Marcos ZAMAREÑO JUANAS 20517195

6. EJEMPLO PRÁCTICO

Por último pasamos a realizar una demo sobre nuestra practica.

25