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); } }
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); }
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)); } }
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); }