420 likes | 687 Views
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.
E N D
.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)
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)
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)
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)
Tres fases: 1ª, analizador léxico Requisitos léxicos .flex .java .class JFLEX JAVAC JAVA
Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX
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
Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX
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
Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX
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
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
Tres fases: 1ª, analizador léxico Importación de paquetes Java %% Flags %{ Área de código Java %} Macros %%estados %% Acciones léxicas .flex JFLEX
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
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
Tres fases: 2ª, analizador sintáctico .flex Requisitos sintácticos JFLEX .cup .java JAVAC 1ª fase .class CUP parser.java parser.class JAVAC JAVA
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()); }
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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;
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;
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;
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;
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;
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
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