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