コード例 #1
0
ファイル: Semantico.cs プロジェクト: jogaha/Compi2
        public Estado InsertarNodoVariable(NodoVariables nodo, NodoClase nodoClaseActiva, string nombreMetodoActivo)
        {
            if (nodoClaseActiva.TSM.ContainsKey(nombreMetodoActivo))
            {
                var        metodos    = nodoClaseActiva.TSM;
                NodoMetodo nodoMetodo = new NodoMetodo();
                foreach (var metodo in metodos)
                {
                    if (metodo.Key.ToString() == nombreMetodoActivo)
                    {
                        nodoMetodo = metodo.Value;
                    }
                }

                if (!nodoMetodo.TSV.ContainsKey(nodo.Lexema))
                {
                    if (nodoClaseActiva.TSA.ContainsKey(nodo.Lexema))
                    {
                        return(Estado.DuplicadoVariableConAtributo);
                    }
                    else
                    {
                        nodoMetodo.TSV.Add(nodo.Lexema, nodo);
                        return(Estado.Insertado);
                    }
                }
                else
                {
                    //se manda el error para el atributo duplicado
                    return(Estado.Duplicado);
                }
            }
            else
            {
                //error de atributo duplicado con clase
                return(Estado.DuplicadoAtributoConClase);
            }
        }
コード例 #2
0
        public Arboles SentenciaAsignacion()
        {
            var sentenciaAsignacion = NuevoNodoSentencia(TipoSentencia.Asignacion);

            if (miListaTokenTemporal[puntero + 1].lexema == "++" || miListaTokenTemporal[puntero + 1].lexema == "--")
            {
                sentenciaAsignacion.lexema   = miListaTokenTemporal[puntero].lexema;
                sentenciaAsignacion.codigoP  = "lda " + miListaTokenTemporal[puntero].lexema;
                sentenciaAsignacion.codigoP2 = "sto";
                Arboles i = NuevoNodoExpresion(TipoExpresion.Identificador);
                i.soyValorTipo = TipoValorNodo.Objeto;
                i.lexema       = miListaTokenTemporal[puntero].lexema;

                Arboles d = NuevoNodoExpresion(TipoExpresion.Constante);
                d.soyValorTipo = TipoValorNodo.Entero;
                d.lexema       = "1";

                Arboles op = NuevoNodoExpresion(TipoExpresion.Operador);
                if (miListaTokenTemporal[puntero + 1].lexema.Substring(0, 1) == "+")
                {
                    op.lexema       = "+";
                    op.soyOperacion = Operaciones.Suma;
                }
                else
                {
                    op.lexema       = "-";
                    op.soyOperacion = Operaciones.Resta;
                }

                op.HijoIzquierdo = i;
                op.HijoDerecho   = d;

                sentenciaAsignacion.HijoIzquierdo = op;
                return(sentenciaAsignacion);
            }
            else
            {
                if (puntero != 0 && new[] { -103, -107, -120, -126, -160 }.Contains(miListaTokenTemporal[puntero - 1].estado))
                {
                    //insertar variable en tabla de simbolos
                    NodoVariables miVariable = new NodoVariables();
                    miVariable.Lexema       = miListaTokenTemporal[puntero].lexema;
                    miVariable.MiTipo       = TipoDato.Int;
                    miVariable.TipoVariable = TipoVariable.Primitive;

                    Estado estadoMetodo = ts.InsertarNodoVariable(miVariable, ts.ObtenerNodoClase(this.claseActiva), this.metodoActivo);
                    if (estadoMetodo == Estado.Duplicado)
                    {
                        //MessageBox.Show("Variable duplicada:'" + miListaTokenTemporal[puntero].lexema + "'. ", "Error  ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        //Application.Exit();
                    }
                }

                sentenciaAsignacion.lexema   = miListaTokenTemporal[puntero].lexema;
                sentenciaAsignacion.codigoP  = "lda " + miListaTokenTemporal[puntero].lexema;
                sentenciaAsignacion.codigoP2 = "sto";

                puntero += 2;
                if (miListaTokenTemporal[puntero].lexema == "cin")
                {
                    sentenciaAsignacion.HijoIzquierdo = sentenciaAsignacion.SentenciaRead(sentenciaAsignacion.lexema);
                }
                else
                {
                    sentenciaAsignacion.HijoIzquierdo = SimpleExpresion();
                }

                return(sentenciaAsignacion);
            }
        }