private void Variable() { double doble; int entero; string nombre = Nombre(); string tipo = Tipo(); string valor = Valor(tipo); // ANALISIS SEMANTICO if (tipo == "doble" && !(Double.TryParse(valor, out doble))) { Proyecto.EscribirEnConsola("ERROR SEMANTICO: El valor de la variable " + nombre + " no es doble"); Proyecto.agregarError("ERROR SEMANTICO: El valor de la variable " + nombre + " no es doble", lexemaActual.fila, lexemaActual.columna); } else if (tipo == "entero" && !(int.TryParse(valor, out entero))) { Proyecto.EscribirEnConsola("ERROR SEMANTICO: El valor de la variable " + nombre + " no es entera"); Proyecto.agregarError("ERROR SEMANTICO: El valor de la variable " + nombre + " no es entera", lexemaActual.fila, lexemaActual.columna); } else if ((tipo == "cadena" && int.TryParse(valor, out entero)) || (tipo == "cadena" && Double.TryParse(valor, out doble))) { Proyecto.EscribirEnConsola("ERROR SEMANTICO: El valor de la variable " + nombre + " no es una cadena"); Proyecto.agregarError("ERROR SEMANTICO: El valor de la variable " + nombre + " no es una cadena", lexemaActual.fila, lexemaActual.columna); } else { Proyecto.agregarVariable(nombre, tipo, valor); } }
//---- ANALIZAR EL LENGUAJE private void scanner(string cadena) { num = 1; Proyecto.numError = 1; int estadoInicial = 0; int estadoActual = 0; char caracterActual; string lexema = ""; string[] L = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "\xD1", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "\xF1", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; string[] N = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" }; string[] I = { "=" }; string[] P = { "." }; string[] PC = { ";" }; string[] m = { "<" }; string[] M = { ">" }; string[] C = { "," }; string[] GB = { "_" }; string[] O = { "+", "-", "*", "/", "^" }; string[] SL = { "\n" }; string[] D = { "/" }; string[] G = { "-" }; string[] DP = { ":" }; string[] A = { "!" }; string[] CN = { "\"" }; int colActual = 0, filaActual = 1, fila = 0, columna = 0; // INICIO DE LAS INTERACIONES for (estadoInicial = 0; estadoInicial < cadena.Length; estadoInicial++) { caracterActual = cadena[estadoInicial]; string caracterActualStr = caracterActual.ToString(); colActual++; // AFD switch (estadoActual) { case 0: // ESTADO 0 fila = filaActual; columna = colActual; if (comparar(L, caracterActualStr)) { lexema += caracterActual; estadoActual = 1; } else if (comparar(N, caracterActualStr)) { lexema += caracterActual; estadoActual = 2; } else if (comparar(C, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(PC, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(M, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(DP, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(D, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(I, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(O, caracterActualStr)) { lexema += caracterActual; estadoActual = 6; } else if (comparar(m, caracterActualStr)) { lexema += caracterActual; estadoActual = 7; } else if (comparar(CN, caracterActualStr)) { lexema += caracterActual; estadoActual = 14; } else { switch (caracterActual) { case ' ': case '\t': case '\b': case '\f': case '\r': estadoActual = 0; break; case '\n': filaActual++; colActual = 0; estadoActual = 0; break; default: lexema += caracterActual; estadoActual = -1; colActual--; break; } } break; case 1: //----- ESTADO 1 ----- if (comparar(L, caracterActualStr)) { estadoActual = 1; lexema += caracterActual; } else if (comparar(N, caracterActualStr)) { estadoActual = 3; lexema += caracterActual; } else if (comparar(GB, caracterActualStr)) { estadoActual = 3; lexema += caracterActual; } else { validarLexema(lexema, fila, columna, "reservado"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; } break; case 2: //----- ESTADO 2 ----- if (comparar(N, caracterActualStr)) { estadoActual = 2; lexema += caracterActual; } else if (comparar(P, caracterActualStr)) { lexema += caracterActual; estadoActual = 4; } else { validarLexema(lexema, fila, columna, "numero"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; } break; case 3: //----- ESTADO 3 ----- if (comparar(L, caracterActualStr)) { estadoActual = 3; lexema += caracterActual; } else if (comparar(N, caracterActualStr)) { lexema += caracterActual; estadoActual = 3; } else if (comparar(GB, caracterActualStr)) { lexema += caracterActual; estadoActual = 3; } else { validarLexema(lexema, fila, columna, "reservado"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; } break; case 4: //----- ESTADO 4 ----- if (comparar(N, caracterActualStr)) { estadoActual = 5; lexema += caracterActual; } else { lexema += caracterActual; estadoActual = -1; colActual--; } break; case 5: //----- ESTADO 5 ----- if (comparar(N, caracterActualStr)) { estadoActual = 5; lexema += caracterActual; } else { validarLexema(lexema, fila, columna, "numero"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; } break; case 6: //----- ESTADO 6 ----- validarLexema(lexema, fila, columna, "reservado"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; break; case 7: //----- ESTADO 7 ----- if (comparar(A, caracterActualStr)) { estadoActual = 8; lexema += caracterActual; } else { validarLexema(lexema, fila, columna, "reservado"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; } break; case 8: //----- ESTADO 8 ----- if (comparar(G, caracterActualStr)) { estadoActual = 9; lexema += caracterActual; } break; case 9: //----- ESTADO 9 ----- if (comparar(G, caracterActualStr)) { estadoActual = 10; lexema += caracterActual; } break; case 10: //----- ESTADO 10 ----- if (comparar(G, caracterActualStr)) { estadoActual = 11; lexema += caracterActual; } else { estadoActual = 10; lexema += caracterActual; } break; case 11: //----- ESTADO 11 ----- if (comparar(G, caracterActualStr)) { estadoActual = 12; lexema += caracterActual; } break; case 12: //----- ESTADO 12 ----- if (comparar(M, caracterActualStr)) { estadoActual = 13; lexema += caracterActual; } break; case 13: //----- ESTADO 9 ----- validarLexema(lexema, fila, columna, "comentario"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; break; case 14: //----- ESTADO 14 ----- if (comparar(CN, caracterActualStr)) { estadoActual = 15; lexema += caracterActual; } else { estadoActual = 14; lexema += caracterActual; } break; case 15: //----- ESTADO 15 ----- validarLexema(lexema, fila, columna, "cadena"); estadoActual = 0; lexema = ""; estadoInicial--; colActual--; break; default: Proyecto.agregarError("ERROR LEXICO: No se reconoce como parte del lenguaje a '" + lexema + "'", fila, columna); estadoInicial--; estadoActual = 0; lexema = ""; break; } } }