コード例 #1
0
        public override Simbolo evaluar(Entorno entorno, Reporte reporte)
        {
            Simbolo izquierda = this.izquierda.evaluar(entorno, reporte);
            Simbolo derecha   = this.derecha.evaluar(entorno, reporte);
            Simbolo resultado;
            Tipos   tipoResultante = util.TablaTipos.getTipo(izquierda.tipo, derecha.tipo);

            if (tipoResultante != Tipos.NUMBER && tipoResultante != Tipos.DOUBLE && tipo != '+')
            {
                throw new util.ErrorPascal(0, 0, "Operacion invalida", "semantico", reporte); // Cambiar Exception por errorPascal
            }
            switch (tipo)
            {
            case '+':
                if (izquierda.tipo.tipo == Tipos.STRING || derecha.tipo.tipo == Tipos.STRING)
                {
                    //Concatenar
                    resultado = new Simbolo(izquierda.ToString() + derecha.ToString(), izquierda.tipo, null);
                }
                else
                {
                    //Sumar
                    resultado = new Simbolo(double.Parse(izquierda.ToString()) + double.Parse(derecha.ToString()), izquierda.tipo, null);
                }
                return(resultado);

            case '-':
                resultado = new Simbolo(double.Parse(izquierda.ToString()) - double.Parse(derecha.ToString()), izquierda.tipo, null);
                return(resultado);

            case '*':
                resultado = new Simbolo(double.Parse(izquierda.ToString()) * double.Parse(derecha.ToString()), izquierda.tipo, null);
                return(resultado);

            case '/':
                resultado = new Simbolo(double.Parse(izquierda.ToString()) / double.Parse(derecha.ToString()), izquierda.tipo, null);
                return(resultado);

            case 'd':
                resultado = new Simbolo(int.Parse(izquierda.ToString()) / int.Parse(derecha.ToString()), new Tipo(Tipos.NUMBER, null), null);
                return(resultado);

            default:
                resultado = new Simbolo(double.Parse(izquierda.ToString()) % double.Parse(derecha.ToString()), izquierda.tipo, null);
                return(resultado);
            }
        }
コード例 #2
0
        public override Simbolo evaluar(Entorno entorno, Reporte reporte)
        {
            Simbolo izquierda = this.izquierda.evaluar(entorno, reporte);
            Simbolo derecha   = this.derecha.evaluar(entorno, reporte);
            Tipo    tipo      = new Tipo(Tipos.BOOLEAN, null);

            Tipos tipoResultante = util.TablaTipos.getTipo(izquierda.tipo, derecha.tipo);

            if (tipoResultante == Tipos.NULLL || tipoResultante != Tipos.BOOLEAN)
            {
                throw new util.ErrorPascal(0, 0, "Tipos De Dato Incorrectos. No se puede realizar la operacion relacional múltiple", "Semantico", reporte);
            }

            switch (tipoOperacion.ToLower())
            {
            case "and":
                return(new Simbolo(bool.Parse(izquierda.ToString()) && bool.Parse(derecha.ToString()), tipo, null));

            case "or":
                return(new Simbolo(bool.Parse(izquierda.ToString()) || bool.Parse(derecha.ToString()), tipo, null));
            }

            return(null);
        }
コード例 #3
0
        public override Simbolo evaluar(Entorno entorno, Reporte reporte)
        {
            Tipo tipo = new Tipo(Tipos.BOOLEAN, null);

            Simbolo izquierda = null;

            if (llamada == null)
            {
                izquierda = this.izquierda.evaluar(entorno, reporte);
            }
            else
            {
                object retornoLlamada = this.llamada.ejecutar(entorno, reporte);
                if (retornoLlamada == null)
                {
                    throw new util.ErrorPascal(0, 0, "La llamada no retorno ningun valor", "semantico", reporte);
                }
                izquierda = (Simbolo)retornoLlamada;
            }

            //Simbolo izquierda = this.izquierda.evaluar(entorno,reporte);
            if (this.derecha == null)
            {
                return(getValor(izquierda));
            }
            Simbolo derecha = this.derecha.evaluar(entorno, reporte);

            Tipos tipoResultante = util.TablaTipos.getTipo(izquierda.tipo, derecha.tipo);

            if (tipoResultante == Tipos.NULLL)
            {
                throw new util.ErrorPascal(0, 0, "Tipos De Dato Incorrectos", "Semantico", reporte);
            }

            switch (tipoOperacion)
            {
            case "=":
                if (izquierda.tipo.tipo == Tipos.STRING || izquierda.tipo.tipo == Tipos.STRING)
                {
                    return(new Simbolo(izquierda.ToString() == derecha.ToString(), tipo, null));
                }
                return(new Simbolo(double.Parse(izquierda.ToString()) == double.Parse(derecha.ToString()), tipo, null));

            case "<>":
                return(new Simbolo(double.Parse(izquierda.ToString()) != double.Parse(derecha.ToString()), tipo, null));

            case ">=":
                return(new Simbolo(double.Parse(izquierda.ToString()) >= double.Parse(derecha.ToString()), tipo, null));

            case ">":
                return(new Simbolo(double.Parse(izquierda.ToString()) > double.Parse(derecha.ToString()), tipo, null));

            case "<=":
                return(new Simbolo(double.Parse(izquierda.ToString()) <= double.Parse(derecha.ToString()), tipo, null));

            case "<":
                return(new Simbolo(double.Parse(izquierda.ToString()) < double.Parse(derecha.ToString()), tipo, null));

            default:
                return(null);
            }

            Simbolo getValor(Simbolo izquierda)
            {
                if (izquierda.tipo.tipo != Tipos.BOOLEAN)
                {
                    throw new util.ErrorPascal(0, 0, "La entrada no es de tipo booleano", "semántico", reporte);
                }
                return(new Simbolo(bool.Parse(izquierda.ToString()) == true, tipo, null));
            }
        }
コード例 #4
0
ファイル: HTMLHelper.cs プロジェクト: MaxDolabella/VisualLAL
        static void CriarHTMLPaginaSimbolo(string raiz, Simbolo simbolo)
        {
            var simboloFilePath = $@"{raiz}\Entradas\{simbolo.Nome}.html";
            var pageTitle       = simbolo.Nome;

            var contents = new List <string>();

            contents.Add($"<!DOCTYPE html>");
            contents.Add($"<html>");

            contents.Add($"<head>");
            contents.Add($"<title>{simbolo.Nome}</title>");
            contents.Add($"</head>");

            contents.Add($"<body>");
            contents.Add($"<h2>{simbolo.ToString()}</h2>");
            contents.Add($"<hr>");
            contents.Add($"<br>");
            contents.Add($"<br>");

            contents.Add($"<h3>Noção:</h3>");
            contents.Add($"<p>");
            foreach (var nocao in simbolo.Nocoes)
            {
                var text       = nocao.Texto;
                var references = VisualLALMapeamento.Instance.MapaReferencias
                                 .Where(m => m.SubEntradaOrigemId.Equals(nocao.Id))
                                 .Select(x => new { Entry = x.EntradaReferenciada, TargetSimboloId = x.SimboloDestinoId });

                foreach (var reference in references)
                {
                    var targetSimbolo = nocao.Store.ElementDirectory.FindElement(reference.TargetSimboloId) as Simbolo;
                    text = text.Replace(reference.Entry, $"<a href=\"{targetSimbolo.Nome}.html\">{reference.Entry}</a>");
                }
                contents.Add($"{text}<br>");
            }
            contents.Add($"</p>");
            contents.Add($"<br>");
            contents.Add($"<br>");

            contents.Add($"<h3>Impacto:</h3>");
            contents.Add($"<p>");
            foreach (var impacto in simbolo.Impactos)
            {
                var text       = impacto.Texto;
                var references = VisualLALMapeamento.Instance.MapaReferencias
                                 .Where(m => m.SubEntradaOrigemId.Equals(impacto.Id))
                                 .Select(x => new { Entry = x.EntradaReferenciada, TargetSimboloId = x.SimboloDestinoId });

                foreach (var reference in references)
                {
                    var targetSimbolo = impacto.Store.ElementDirectory.FindElement(reference.TargetSimboloId) as Simbolo;
                    text = text.Replace(reference.Entry, $"<a href=\"{targetSimbolo.Nome}.html\">{reference.Entry}</a>");
                }
                contents.Add($"{text}<br>");
            }
            contents.Add($"</p>");

            contents.Add($"</body>");
            contents.Add($"</html>");

            File.WriteAllLines(simboloFilePath, contents, Encoding.Default);
        }