public Token(TipoSintaxis kind, int position, string text, object value) { Tipo = kind; Position = position; Text = text; Value = value; }
private Token CoincideCon(TipoSintaxis tipo) { if (TokenActual.Tipo == tipo) { return(SiguienteToken()); } _diagnostics.Add($"ERROR: Token inesperado <{TokenActual.Tipo}>, se esperaba <{tipo}>"); return(new Token(tipo, TokenActual.Position, null, null)); }
public Token EvaluarExpresionAritmetica(Expresion nodo, TipoSintaxis tipo) { if (nodo is ExpresionNumericaInvalida invalidExpression) { return(new Token(TipoSintaxis.TokenInvalido, 0, null, null)); } if (nodo is ExpresionEntera n) { int valor = Convert.ToInt32((Convert.ToDouble(n.Numero.Value))); var tokenEntero = new Token(TipoSintaxis.TokenInteger, 0, valor.ToString(), valor); return(tokenEntero); } //if (nodo is ExpresionEntera n) //{ // int valor = Convert.ToInt32((Convert.ToDouble(n.Numero.Value))); // var tokenEntero = new Token(TipoSintaxis.TokenInteger, 0, valor.ToString(), valor); // return tokenEntero; //} if (nodo is ExpresionDecimal nd) { float valor = (float)nd.Numero.Value; var tokenDecimal = new Token(TipoSintaxis.TokenDecimal, 0, valor.ToString(), valor); return(tokenDecimal); } if (nodo is ExpresionIdentificador id) { var identificador = id.Identificador; var tokenNumero = (TablaSimbolos[identificador.Value.ToString()] as Token).Value; if (!TablaSimbolos.ContainsKey(identificador.Value.ToString())) { Console.WriteLine($"ERROR: Variable no declarada <{identificador}>"); Diagnostico.Add($"ERROR: Variable no declarada <{identificador}>"); } else if (!(tokenNumero is null)) { var stringData = tokenNumero.ToString(); // if contains a dot, then is decimal. if (stringData.Contains(".")) { float.TryParse(stringData, out var val); return(new Token(TipoSintaxis.TokenDecimal, 0, val.ToString(), val)); } int.TryParse(stringData, out var value); return(new Token(TipoSintaxis.TokenInteger, 0, value.ToString(), value)); } // Invalid number return(null); } if (nodo is ExpresionBinaria b) { var izquierda = EvaluarExpresionAritmetica(b.Izquierda, tipo); var derecha = EvaluarExpresionAritmetica(b.Derecha, tipo); if (b.Operador.Tipo == TipoSintaxis.TokenMas) { if (izquierda.Tipo is TipoSintaxis.TokenInteger && derecha.Tipo is TipoSintaxis.TokenInteger) { int result = int.Parse(izquierda.Value.ToString()) + int.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) + float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else if (b.Operador.Tipo == TipoSintaxis.TokenMenos) { if (izquierda.Tipo is TipoSintaxis.TokenInteger && derecha.Tipo is TipoSintaxis.TokenInteger) { int result = int.Parse(izquierda.Value.ToString()) - int.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) - float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else if (b.Operador.Tipo == TipoSintaxis.TokenMultiplicacion) { if (izquierda.Tipo is TipoSintaxis.TokenInteger && derecha.Tipo is TipoSintaxis.TokenInteger) { int result = int.Parse(izquierda.Value.ToString()) * int.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) * float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else if (b.Operador.Tipo == TipoSintaxis.TokenDivision) { if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) / float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else if (b.Operador.Tipo == TipoSintaxis.TokenPotencia) { if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) + float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else if (b.Operador.Tipo == TipoSintaxis.TokenModulo) { if (izquierda.Tipo is TipoSintaxis.TokenInteger && derecha.Tipo is TipoSintaxis.TokenInteger) { int result = int.Parse(izquierda.Value.ToString()) % int.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } if (izquierda.Tipo is TipoSintaxis.TokenDecimal || derecha.Tipo is TipoSintaxis.TokenDecimal) { float result = float.Parse(izquierda.Value.ToString()) % float.Parse(derecha.Value.ToString()); return(new Token(TipoSintaxis.TokenInteger, 0, result.ToString(), result)); } } else { throw new Exception($"Operador binario inesperado: {b.Operador.Tipo}"); } } if (nodo is ExpresionEnParentesis p) { return(EvaluarExpresionAritmetica(p.Expresion, tipo)); } throw new Exception($"Nodo inesperado {nodo.Tipo}"); }