Ejemplo n.º 1
0
 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));
        }
Ejemplo n.º 3
0
        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}");
        }