Advertisement
LinkStormer

Main.java

May 25th, 2025 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.62 KB | Source Code | 0 0
  1. import java.io.FileReader;
  2. import java.io.IOException;
  3.  
  4. public class Main {
  5.     private static int currentOutputLine = 0;
  6.  
  7.     public static void main(String[] args) {
  8.         if (args.length == 0) {
  9.             testFile("input.txt");
  10.             testFile("input_error.txt");
  11.             System.out.println("\nUso: java Main <archivo>");
  12.         } else {
  13.             for (String filename : args) {
  14.                 testFile(filename);
  15.             }
  16.         }
  17.     }
  18.  
  19.     private static void testFile(String filename) {
  20.         try {
  21.             Lexer lexer = new Lexer(new FileReader(filename));
  22.             System.out.println("\n=== Análisis: " + filename + " ===");
  23.             currentOutputLine = 0;  // Reset para cada archivo
  24.            
  25.             // --- Análisis Léxico y Sintáctico ---
  26.             // Crear el parser y ejecutarlo
  27.             Parser parser = new Parser(lexer);
  28.             parser.parse(); // ¡Aquí se realiza el análisis sintáctico!
  29.  
  30.             Integer token;
  31.             while ((token = lexer.yylex()) != null) {
  32.                 printTokenInfo(lexer, token);
  33.             }
  34.            
  35.             printFooter(filename);
  36.         } catch (IOException e) {
  37.             System.err.println("Error leyendo archivo: " + e.getMessage());
  38.         } catch (Exception e) {
  39.             System.err.println("Error: " + e.getMessage());
  40.         }
  41.     }
  42.  
  43.     private static void printTokenInfo(Lexer lexer, int token) {
  44.         // Manejo de cambio de línea
  45.         if (lexer.currentLine != currentOutputLine) {
  46.             System.out.printf("\nLINEA %-3d\t\tSIMBOLO\n", lexer.currentLine);
  47.             currentOutputLine = lexer.currentLine;
  48.         }
  49.  
  50.         String lexema = lexer.yytext();
  51.         String output;
  52.  
  53.         if (token == sym.IDENTIFICADOR) {
  54.             int id = lexer.getIdentificadorId(lexema);
  55.             output = String.format("%s : es un identificador - Valor atrib: %d", lexema, id);
  56.         } else if (token == sym.ENTERO || token == sym.DECIMAL) {
  57.             output = String.format("%s : es un Numero", lexema);
  58.         } else if (token == sym.STRING) {
  59.             output = String.format("%s : es un texto", lexema);
  60.         } else {
  61.             String tokenDisplayName = getDisplayName(token, lexema);
  62.             if (tokenDisplayName != null) {
  63.                 output = String.format("%s - Token: %s", lexema, tokenDisplayName);
  64.             } else {
  65.                 output = String.format("%s: Símbolo no definido", lexema);
  66.             }
  67.         }
  68.  
  69.         System.out.printf("%-20s | %s%n",
  70.             "Línea " + lexer.currentLine + " Col " + lexer.currentColumn,
  71.             output);
  72.     }
  73.  
  74.     // Actualiza esta función para reflejar los nuevos tokens y nombres de Sym.java y LexerGenerator-2.flex
  75.     private static String getDisplayName(int token, String lexeme) {
  76.         switch (token) {
  77.             case sym.RESPUESTA_CONTRARIA: return "RESPUESTA_CONTRARIA";
  78.             case sym.SWITCH: return "SWITCH";
  79.             case sym.BUCLE_FOR: return "BUCLE_FOR";
  80.             case sym.BUCLE_WHILE: return "BUCLE_WHILE";
  81.             case sym.BUCLE_DO: return "BUCLE_DO";
  82.             case sym.BUCLE_FOREACH: return "BUCLE_FOREACH";
  83.             case sym.PARENTESIS_IZQ:
  84.             case sym.LLAVE_IZQ:
  85.             case sym.CORCHETE_IZQ: return "APERTURA";
  86.             case sym.PARENTESIS_DER:
  87.             case sym.LLAVE_DER:
  88.             case sym.CORCHETE_DER: return "CIERRE";
  89.             case sym.OPERADOR_COMPARACION: return "OPERADOR_COMPARACION";
  90.             case sym.OPERADOR_LOGICO:
  91.                 return lexeme.equals("!") ? "OPERADOR_LOGICO" : "OPERADORES_LOGICOS";
  92.             case sym.SUMA: return "SUMA";
  93.             case sym.RESTA: return "RESTA";
  94.             case sym.MULTIPLICACION: return "MULTIPLICACION";
  95.             case sym.DIVISION: return "DIVISION";
  96.             case sym.MODULO: return "MODULO";
  97.             case sym.INCREMENTO: return "INCREMENTO";
  98.             case sym.DECREMENTO: return "DECREMENTO";
  99.             case sym.CLASS: return "CLASS";
  100.             case sym.HERENCIA: return "HERENCIA";
  101.             case sym.INTERFAZ: return "INTERFAZ";
  102.             case sym.LITERAL: return "LITERAL";
  103.             case sym.SQL: return "SQL";
  104.             case sym.TIPO_DATO:
  105.                 switch (lexeme) {
  106.                     case "int": return "TIPO_ENTERO";
  107.                     case "float": return "TIPO_DECIMAL";
  108.                     case "string": return "TIPO_TEXTO";
  109.                     case "bool": return "TIPO_BOOLEANO";
  110.                     // Agrega aquí nuevos tipos de datos si los agregaste en Sym.java y el lexer
  111.                     default: return "TIPO_DATO";
  112.                 }
  113.             case sym.PUNTO_COMA: return "PUNTO_COMA";
  114.             case sym.ASIGNACION: return "ASIGNACION";
  115.             case sym.COMA: return "COMA";
  116.             case sym.DOS_PUNTOS: return "DOS_PUNTOS";
  117.             case sym.RETORNO: return "RETORNO";
  118.             case sym.ERROR: return "ERROR";
  119.  
  120.             case sym.DO: return "BUCLE_DO";
  121.             case sym.FOREACH: return "BUCLE_FOREACH";
  122.             case sym.EXCEPCION: return "EXCEPCION";
  123.             case sym.CREATE: return "CREATE";
  124.             case sym.DATABASE: return "DATABASE";
  125.             case sym.SET: return "SET";
  126.             case sym.VALOR: return "VALOR";
  127.             default: return null;
  128.         }
  129.     }
  130.  
  131.     private static void printFooter(String filename) {
  132.         System.out.println("----------------------------------------");
  133.         System.out.println("Archivo procesado: " + filename);
  134.         System.out.println("----------------------------------------\n");
  135.     }
  136. }
Tags: Java jflex jcup
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement