1 / 39

Introducción a la práctica de Procesadores de Lenguajes

Introducción a la práctica de Procesadores de Lenguajes. .jflex. .cup. JFLEX. CUP. Tabla de Símbolos, estructuras, etc. .java. .java. .java. .java. .java. JAVAC. JAVAC. Token. Token. Token. Token. Tres fases. MLB. Analizador léxico. Analizador Sintáctico + semántico.

zanthe
Download Presentation

Introducción a la práctica de Procesadores de Lenguajes

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introducción a la práctica deProcesadores de Lenguajes

  2. .jflex .cup JFLEX CUP Tabla de Símbolos, estructuras, etc. .java .java .java .java .java JAVAC JAVAC Token Token Token Token Tres fases MLB Analizador léxico Analizador Sintáctico+semántico • Errores/Corrección • Traducción • - ... (actuación en consecuencia)

  3. Token Token Token Token Tres fases 1 .jflex .cup JFLEX CUP Tabla de Símbolos, estructuras, etc. .java .java .java .java .java JAVAC JAVAC MLB Analizador léxico Analizador Sintáctico+semántico • Errores/Corrección • Traducción • - ... (actuación en consecuencia)

  4. Token Token Token Token Tres fases 2 .jflex .cup JFLEX CUP Tabla de Símbolos, estructuras, etc. .java .java .java .java .java JAVAC JAVAC MLB Analizador léxico Analizador Sintáctico+semántico • Errores/Corrección • Traducción • - ... (actuación en consecuencia)

  5. Token Token Token Token Tres fases 3 .jflex .cup JFLEX CUP Tabla de Símbolos, estructuras, etc. .java .java .java .java .java JAVAC JAVAC MLB Analizador léxico Analizador Sintáctico+semántico • Errores/Corrección • Traducción • - ... (actuación en consecuencia)

  6. Tres fases: 1ª, analizador léxico Requisitos léxicos .flex .java .class JFLEX JAVAC JAVA

  7. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX

  8. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas import java_cup.runtime.Symbol; import java.io.*; import java.util.*; .flex JFLEX

  9. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX

  10. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas %standalone Habilita función “main”, la clase generada será ejecutable %line Habilita cuenta de líneas %column Habilita cuenta de columnas %cup Habilita compatibilidad Cup %class AnalizadorLexico La clase generada no se llamará Yylex http://jflex.de/manual.html#SpecOptions .flex JFLEX

  11. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX

  12. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas letra = [a-zA-Z] cifra = [0-9] numero = {cifra}+ identificador = {letra} ( {letra} | {numero} | _ )* .flex JFLEX

  13. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas %states COMENTARIO %states CADENA No es necesario declarar aquí el estado inicial por defecto, llamado YYINITIAL .flex JFLEX

  14. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX

  15. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas "," { System.out.println(“Linea: “+yyline); System.out.println(“Columna: “+yycolumn); } {identificador} { funcion(yytext(),variable); System.out.println(“ID: “+yytext()); } El método “funcion” y la variable “variable” deben estar declarados en el área de código Java .flex JFLEX

  16. Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas <YYINITIAL> { /* ... */ "/*" { tipoComentario=2; yybegin(COMENTARIO); } } <COMENTARIO> { "*/" { yybegin(YYINITIAL); } } .flex JFLEX

  17. Tres fases: 2ª, analizador sintáctico .flex Requisitos sintácticos JFLEX .cup .java JAVAC 1ª fase .class CUP parser.java parser.class JAVAC JAVA

  18. Tres fases: 2ª, analizador sintáctico • Integración de JFLEX y CUP: • Adición del flag “%cup” en la especificación para JFLEX • Descarga de CUP desde internet e inserción de su ruta completa en la variable CLASSPATH del sistema • Coordinación de los tipos de tokens que se devuelven en la especificación JFLEX con los esperados por CUP (declarados en la especificación para CUP)“module” { System.out.println(“<t_module>"); }“module” { return new Symbol (sym.t_module, yyline, yycolumn, yytext()); }

  19. String Character Float Integer Boolean Clases Java de envoltura Tres fases: 2ª, analizador sintáctico • Caracteres encontrados Contenidos enviadosen la cadena de entrada desde léxico a sintáctico • “hola” Token Constante Cadena hola • “ho\”la”Token Constante Cadenaho”la • ’a’ Token Constante Caráctera • ’\’’ Token Constante Carácter’ • -.45789EXP3 Token Constante Real -457.89 • 345.345 Token Constante Real 345.345 • -234 Token Constante Entera -234 • true Token Constante Booleana true

  20. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática .cup CUP

  21. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática import java.io.*; import java.util.*; .cup CUP

  22. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática Código que contiene métodos auxiliares yvariables, este código se incrusta en unaclase embebida del parser. Aquí se declarará una variable global queacogerá la tabla de símbolos para la fasede análisis semántico, será directamenteaccesible desde las acciones semánticasque se incorporarán a la gramática en dichafase. También se podrán declarar métodosauxiliares. .cup CUP

  23. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática código que flexibiliza el uso del parser,este código se incrusta directamente en laclase parser. Aquí se inserta el método“main” que arranca la ejecución delanalizador sintáctico. .cup CUP

  24. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática public static void main(String args[]) throws Exception { try { new parser(new lexico( new FileReader(args[0]))).parse(); } catch(FileNotFoundException e) { System.out.println("Archivo no encontrado"); } catch(IOException e){ System.out.println("Error de lectura"); e.printStackTrace(); } catch(Exception e){ System.out.println("Excepción. Pila:"); e.printStackTrace(); } } .cup CUP

  25. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática Son partes opcionales init with: El parser ejecutará el códigoaquí introducido antes de pedir el primertoken. scan with: código que devolverá símbolos. .cup CUP

  26. En la especificación para JFLEX:“module”{ return new Symbol(sym.t_module, yyline, yycolumn, yytext());}... Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática Área donde definir todos los símbolosterminales que aparecerán en la gramática.terminal t_module; terminal t_end; terminal t_operador_suma;terminal t_puntocoma;... .cup CUP

  27. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática Área donde definir todos los símbolosno terminales de los que consta lagramática.non terminal PROGRAMA; non terminal DECLARACIONES; non terminal DECL_VAR; ... .cup CUP

  28. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias(prohibido) Gramática .cup CUP

  29. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática PROGRAMA ::= t_module t_id t_integerv DECLARACIONES t_end t_id t_puntocoma PROGRAMA {: :} | t_module t_id t_integerv DECLARACIONES t_end t_id t_puntocoma {: :} ; DECLARACIONES ::= DECL_VAR t_puntocoma DECLARACIONES {: :} | DECL_FUN DECLARACIONES {: :} | DECL_VAR t_puntocoma {: :} | DECL_FUN {: :} ;... .cup CUP

  30. Tres fases: 2ª, analizador sintáctico Importación de paquetes Java action code {: ... :} parser code {: ... :} init with {: ... :} scan with {: ... :} Declaración de terminales Declaración de no terminales Declaración de precedencias (prohibido) Gramática {: :} Son acciones semánticas. Aparecen siempre al final de cada regla. En ellasse insertará código Java en la tercera fase, la del análisis semántico. Ahoraen la segunda fase no hace falta ni siquiera insertarlas en la gramática: PROGRAMA ::= t_module t_id t_integerv DECLARACIONES t_end t_id t_puntocoma PROGRAMA | t_module t_id t_integerv DECLARACIONES t_end t_id t_puntocoma ;... .cup CUP

  31. Tres fases: 3ª, analizador semántico .flex Requisitos semánticos JFLEX .cup .java Acciones semánticas JAVAC 1ª fase .class CUP parser.java parser.class JAVAC JAVA

  32. Tres fases: 3ª, analizador semántico exp::= exp opSuma exp {:acción semántica:} Cup implementa un analizador sintáctico ascendente, no se manejarán atributos heredados • Uso de identificadores (¿declarados?) • Variables asignadas antes de usar • Índices de array dentro de rango válido • Operandos adecuados en expresiones • Invocación correcta de funciones y procedimientos • Tipo de valor de retorno adecuado en funciones • ... exp exp opSuma exp

  33. Tres fases: 3ª, analizador semántico ... terminal int, float, semicolon, comma; terminal id; non terminal DECL, LID, T; ... // Gramática ... DECL ::= T LID semicolon {: // Introducir en tabla de // símbolos realizando las // comprobaciones necesarias :}; T ::= int | float; LID ::= id comma LID | id ; ... // Gramática int v1, x, indice;

  34. Tres fases: 3ª, analizador semántico ... terminal int, float, semicolon, comma; terminal id; non terminal DECL, LID, T; ... // Gramática ... DECL ::= T LID semicolon {: // Introducir en tabla de // símbolos realizando las // comprobaciones necesarias :}; T ::= int {: T.tipo = int :} | float {: T.tipo = float :} ; LID ::= id comma LID | id ; ... // Gramática int v1, x, indice;

  35. Tres fases: 3ª, analizador semántico ... terminal int, float, semicolon, comma; terminal id; non terminal DECL, LID; non terminal Dato T; ... DECL ::= T LID semicolon {: // Introducir en tabla de // símbolos realizando las // comprobaciones necesarias :}; T ::= int {: Dato miDato=new Dato(); miDato.setTipo(Dato.T_INT); RESULT= miDato; :} | float {: ... :} ; LID ::= id comma LID | id ; ... // Gramática int v1, x, indice;

  36. Tres fases: 3ª, analizador semántico ... terminal int, float, semicolon, comma; terminal id; non terminal DECL, LID; non terminal Dato T; ... DECL ::= T LID semicolon {: // Introducir en tabla de // símbolos realizando las // comprobaciones necesarias :}; T ::= int {: ... :} | float {: ... :} ; LID ::= id comma LID1{: LID.lista = LID1.lista.add(id) :} | id {: LID.lista = nuevaLista(id) :} ; ... // Gramática int v1, x, indice;

  37. Tres fases: 3ª, analizador semántico ... terminal int, float, semicolon, comma; terminal id; non terminal DECL; non terminal ArrayList<String> LID; non terminal Dato T; ... DECL ::= T LID semicolon {: // Introducir en tabla de // símbolos realizando las // comprobaciones necesarias :}; T ::= int {: ... :} | float {: ... :} ; LID ::= id:ident comma LID:lista{:lista.add(ident);RESULT = lista;:} | id:ident {: ArrayList<String> miLista = new ArrayList<String>(); miLista.add(ident); RESULT = miLista; :} ; ... // Gramática int v1, x, indice;

  38. Tres fases: 3ª, analizador semántico public class Dato { final int T_INT = 1; final int T_FLOAT = 2; ... int tipo; // Entero, Float... int clase; // Var. local, método, clase... ... public Dato() { //... } public void setTipo(int valorTipo) { this.tipo=valorTipo; } ... } Clase Dato.javaPermite subir información a través de la gramática y de sus símbolos no terminalesDebe implementarse a medida de las necesidades que se encuentren durante el desarrollo de la práctica

  39. Tres fases: 3ª, analizador semántico Archivo .LEX {id} {return new Symbol(sym.id,yyline,yycolumn,yytext());} ______________ class Symbol { ... int left; int right;Object value; ... } En la gramática de CUP: id:ident Acceso a atributo valuede la instancia de la clase Symboldada por el analizador léxico Origen: léxicoDestino: sintáctico

More Related