예제 #1
0
        protected override void CrearComportamiento(string cadena, DeclaraciónDeContexto declaración, int desplazamiento)
        {
            var parámetro = new Parámetro
            {
                Tipo   = TipoDeVariable,
                Nombre = NombreDeVariable
            };

            declaración.CrearParámetro(parámetro);

            base.CrearComportamiento(cadena, declaración, desplazamiento);

            var cargarDatoDeParámetro = new CargarDatoEnVariable(NombreDeVariable, cadena)
            {
                Inicio = desplazamiento
            };

            declaración.Instrucciones.Enqueue(cargarDatoDeParámetro);
        }
예제 #2
0
        protected sealed override void ProcesarCadena(string cadena, MatchCollection coincidencias, DeclaraciónDeContexto declaración, int desplazamiento)
        {
            _coincidencia  = coincidencias[0];
            TipoDeVariable = CrearTipo();

            if (cadena.Length != _coincidencia.Value.Length)
            {
                throw new ErrorDeCompilación(
                          new ErrorDeDeclaración(
                              cadena,
                              string.Format(ERROR_TIPO_INVALIDO, TipoDeVariable.Nombre),
                              coincidencias[0].Index + desplazamiento,
                              cadena.Length));
            }

            if (declaración.VariablesDeclaradas.Where(v => v.Nombre == NombreDeVariable).Count() > 0)
            {
                throw new ErrorDeCompilación(
                          new ErrorDeDeclaración(
                              cadena,
                              ERROR_VARIABLE_EXISTENTE,
                              coincidencias[0].Index + desplazamiento,
                              cadena.Length));
            }

            var valorDeVariable = _coincidencia.Groups[NOMBRE_GRUPO_VALOR_DE_VARIABLE];

            if (string.IsNullOrEmpty(valorDeVariable.Value))
            {
                if (cadena.Contains(Lenguaje.OperadorDeAsignación))
                {
                    throw new ErrorDeCompilación(
                              new ErrorDeDeclaración(
                                  cadena,
                                  ERROR_DECLARACION_SIN_VALOR,
                                  coincidencias[0].Index + desplazamiento,
                                  cadena.Length));
                }
                //else
                //{
                //    var instrucción = new ApilarDato(TipoDeVariable.ValorPorDefecto, cadena)
                //    {
                //        Inicio = desplazamiento
                //    };
                //    declaración.Instrucciones.Enqueue(instrucción);
                //}
            }
            else
            {
                _evaluador.Procesar(valorDeVariable.Value, declaración, desplazamiento + valorDeVariable.Index);
                if (TipoDeVariable.Nombre != _evaluador.TipoDeSalida.Nombre)
                {
                    string mensaje = string.Format(ERROR_TIPO_INVALIDO, TipoDeVariable.Nombre);
                    throw new ErrorDeCompilación(
                              new ErrorDeDeclaración(
                                  cadena,
                                  mensaje,
                                  coincidencias[0].Index + desplazamiento,
                                  cadena.Length));
                }
            }

            CrearComportamiento(coincidencias[0].Value, declaración, desplazamiento);

            if (!string.IsNullOrEmpty(valorDeVariable.Value))
            {
                var cargarValorEnVariable = new CargarDatoEnVariable(NombreDeVariable, cadena)
                {
                    Inicio = desplazamiento
                };
                declaración.Instrucciones.Enqueue(cargarValorEnVariable);
            }
        }