public TypeG Visit(CallNode node)
        {
            Console.WriteLine("INICIO" + node.ToStringTree());
            VisitChildren(node);
            Console.WriteLine("FIN");
            var   name = node.AnchorToken.Lexeme;
            var   parametersRequired = 0;
            TypeG typeRequired       = TypeG.VOID;
            TypeG typeRequired2      = TypeG.VOID;
            TypeG returnType         = TypeG.VOID;

            switch (name)
            {
            case "WrInt":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER;
                break;

            case "WrStr":
                parametersRequired = 1;
                typeRequired       = TypeG.STRING;
                break;

            case "WrLn":
                break;

            case "RdInt":
                returnType = TypeG.INTEGER;
                break;

            case "RdStr":
                returnType = TypeG.STRING;
                break;

            case "AtStr":
                parametersRequired = 2;
                typeRequired       = TypeG.STRING;
                typeRequired2      = TypeG.INTEGER;
                returnType         = TypeG.STRING;
                break;

            case "LenStr":
                parametersRequired = 1;
                typeRequired       = TypeG.STRING;
                returnType         = TypeG.INTEGER;
                break;

            case "CmpStr":
                parametersRequired = 2;
                typeRequired       = TypeG.STRING;
                typeRequired2      = TypeG.STRING;
                returnType         = TypeG.INTEGER;
                break;

            case "CatStr":
                parametersRequired = 2;
                typeRequired       = TypeG.STRING;
                typeRequired2      = TypeG.STRING;
                returnType         = TypeG.STRING;
                break;

            case "LenLstInt":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER_LIST;
                returnType         = TypeG.INTEGER;
                break;

            case "LenLstStr":
                parametersRequired = 1;
                typeRequired       = TypeG.STRING_LIST;
                returnType         = TypeG.INTEGER;
                break;

            case "LenLstBool":
                parametersRequired = 1;
                typeRequired       = TypeG.BOOLEAN_LIST;
                returnType         = TypeG.INTEGER;
                break;

            case "NewLstInt":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER;
                returnType         = TypeG.INTEGER_LIST;
                break;

            case "NewLstStr":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER;
                returnType         = TypeG.STRING_LIST;
                break;

            case "NewLstBool":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER;
                returnType         = TypeG.BOOLEAN_LIST;
                break;

            case "IntToStr":
                parametersRequired = 1;
                typeRequired       = TypeG.INTEGER;
                returnType         = TypeG.STRING;
                break;

            case "StrToInt":
                parametersRequired = 1;
                typeRequired       = TypeG.STRING;
                returnType         = TypeG.INTEGER;
                break;

            default:
                throw new Exception($"Function {name} has no declared call");
            }

            if (parametersRequired > 0)
            {
                dynamic tipo = Visit((dynamic)node[0]);

                if (node.getLength() == parametersRequired)
                {
                    if (typeRequired == tipo)
                    {
                        return(returnType);
                    }
                    else
                    {
                        throw new SemanticError($"No type match for Call: "
                                                + $"expected {typeRequired} but got {tipo}", node.AnchorToken);
                    }
                }
                else
                {
                    throw new SemanticError($"Wrong number of params to procedure call: "
                                            + $"expected {parametersRequired} but got {node.getLength()}", node.AnchorToken);
                }
            }
            return(TypeG.VOID);
        }