/// <summary> /// Crea la instrucción de llamada a un Mixin /// </summary> private InstructionBase CreateInstructionMininCall() { InstructionMixinCall instruction = new InstructionMixinCall(GetToken()); TokenSmallCss token = GetToken(); // Obtiene los datos if (token.Row == instruction.Token.Row && token.TypeCss == TokenSmallCss.TokenCssType.Literal) { // Asigna el nombre de la función instruction.Name = token.Value; // Obtiene los argumentos if (ActualToken != null && ActualToken.Row == instruction.Token.Row) { bool end = false; while (!end && !IsEof) { // Comprueba si es un parámetro o un comentario if (ActualToken.Row == instruction.Token.Row) { if (ActualToken.TypeCss == TokenSmallCss.TokenCssType.Literal || ActualToken.TypeCss == TokenSmallCss.TokenCssType.Variable) { instruction.Parameters.Add(GetToken()); } else if (ActualToken.TypeCss == TokenSmallCss.TokenCssType.Comment) { instruction.Sentences.Add(CreateInstructionComment()); } else { instruction.Error = ParseError($"No se reconoce el token entre los parámetros de llamada a la función '{instruction.Name}'"); } } else { end = true; } } } } else { instruction.Error = ParseError("No se encuentra el nombre del mixin al que se está llamando"); } // Devuelve la instrucción return(instruction); }
/// <summary> /// Ejecuta una llamada a una función /// </summary> private string CallFunction(InstructionMixinCall function, string tagParent, List <string> lines) { string result = ""; // Obtiene la cadena de la función if (function != null) { Program programFunction = Program.Functions.Search(function.Name); if (programFunction != null) { List <string> lineChilds = new List <string>(); // Borra la tabla de símbolos programFunction.SymbolsTable.Variables.Clear(); // Añade las variables for (int index = 0; index < programFunction.Arguments.Count; index++) { if (function.Parameters.Count > index) { string value = function.Parameters[index].Value; // Si es una variable recoge el valor if (value.StartsWithIgnoreNull("$")) { value = GetVariableValue(programFunction, value); } // Añade la variable programFunction.SymbolsTable.Variables.Add(programFunction.Arguments[index], value); } } // Obtiene el contenido de las líneas hija result = GetContentChildSentences(programFunction, programFunction.Sentences, tagParent, lineChilds); // Añade las líneas hija lines.AddRange(lineChilds); } } // Devuelve el resultado return(result); }